博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asia Yokohama Regional Contest 2018 B题 - Arithmetic Progressions(dp)
阅读量:7210 次
发布时间:2019-06-29

本文共 1265 字,大约阅读时间需要 4 分钟。

题意

给定一些数,可以重新排序,求其中最长的等差数列的长度

思路

d[i][j]表示以a[i]和a[j]为开头的等差数列的最大长度,具体见代码

if后面意思就是说两边加起来等于中间的值两倍的时候就可以构成等差数列了,比中间值两倍大的话就要去移动左指针使其变小,比中间值两倍要小的话就要去移动右指针使其变大,反正目的就是要找到可以构成等差数列的点。

1 #define bug(x,y) cout<<"i="<
<<": "<
<
4 #define itor ::iterator 5 using namespace std; 6 typedef long long ll; 7 typedef pair
P; 8 #define pb push_back 9 #define se second10 #define fi first11 #define rs o*2+112 #define ls o*213 const int N=5e3+5;14 int n;15 int a[N],d[N][N];16 int main(){17 scanf("%d",&n);18 for(int i=1;i<=n;i++){19 scanf("%d",&a[i]);20 }21 sort(a+1,a+1+n);22 for(int i=1;i<=n;i++){23 for(int j=1;j<=n;j++)d[i][j]=2;24 }25 int ans=2;26 for(int i=n-1;i>=2;i--){27 int j=i-1,k=i+1;28 while(j>=1&&k<=n){29 if(a[j]+a[k]==2*a[i]){30 d[j][i]=d[i][k]+1;31 ans=max(ans,d[j][i]);32 j--;k++;33 }34 else if(a[j]+a[k]<2*a[i]){35 k++;36 }37 else if(a[j]+a[k]>2*a[i]){38 j--;39 }40 }41 }42 printf("%d\n",ans);43 }

 

转载于:https://www.cnblogs.com/ccsu-kid/p/10599443.html

你可能感兴趣的文章
首届渣打科营编程马拉松赛初赛圆满结束
查看>>
三大超算军团加速布局 中科曙光E级超算预研项目正式启动
查看>>
高计算密度+低功耗!浪潮新一代高密度服务器SA5248M4横空出世
查看>>
GPU驱动“后摩尔定律时代” 为HPC和深度学习提供强大加速动力
查看>>
工信部副部长怀进鹏:信息产业呈现四大发展特点
查看>>
专访uPlane陈宏强:手机遥控固定翼飞机还是蓝海
查看>>
读懂Android中的代码混淆
查看>>
新IT运维模式下,全栈溯源助你解应用性能监控难题
查看>>
云存储标准应运而生
查看>>
物联网创新领域的三大驱动性趋势
查看>>
X光扫描揭示芯片密码卡入侵手段
查看>>
如何重新定义云数据中心的资源利用率
查看>>
一个PHP压缩类,在线压缩文件
查看>>
中国5G研发试验喜迎“小学课本”
查看>>
JavaScript依赖注入的实现思路
查看>>
防数据泄密:是否应实施“多重认证”?
查看>>
关于PHP的错误机制总结
查看>>
美国网络司令部133支网络部队已拥有初步作战能力
查看>>
如何看待阿里云加入Linux基金会金牌会员?
查看>>
三大应用需求:5G信道编码技术取得突破
查看>>