51Nod 1055 思维 + DP
2017-12-24 00:33
141 查看
题目链接
题意:求n个数中最长的等差数列(差任意)
思路:
利用等差数列的性质:
若a[i]、a[j]、a[k]为等差数列,则一定有:
a[j]∗2=a[i]+a[k]
故我们考虑枚举这么一个三元组进行DP。
设dp[i][j]为1−j中满足以a[j]结尾,公差为d=a[j]−a[i]的最长等差数列的长度
考虑枚举三元组的中间数的位置i
设l=i−1、r=i+1
当
a[l]+a[r]>2∗a[i]时 l−−
a[l]+a[r]<2∗a[i]时 r++
a[l]+a[r]==2∗a[i]时,更新dp[i][r]=dp[l][i]+1
初始时每一个dp数组里的元素值均为2。
代码:
题意:求n个数中最长的等差数列(差任意)
思路:
利用等差数列的性质:
若a[i]、a[j]、a[k]为等差数列,则一定有:
a[j]∗2=a[i]+a[k]
故我们考虑枚举这么一个三元组进行DP。
设dp[i][j]为1−j中满足以a[j]结尾,公差为d=a[j]−a[i]的最长等差数列的长度
考虑枚举三元组的中间数的位置i
设l=i−1、r=i+1
当
a[l]+a[r]>2∗a[i]时 l−−
a[l]+a[r]<2∗a[i]时 r++
a[l]+a[r]==2∗a[i]时,更新dp[i][r]=dp[l][i]+1
初始时每一个dp数组里的元素值均为2。
代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int A = 1e4 + 10; short int dp[A][A]; int a[A]; int main(){ int n; scanf("%d",&n); for(int i=0 ;i<n ;i++) scanf("%d",&a[i]); sort(a,a+n); int ans = 0; for(int i=0 ;i<n ;i++){ int l = i-1,r = i+1; while(l>=0 && r<n){ if(a[l]+a[r] > 2*a[i]) l--; else if(a[l] + a[r] < 2*a[i]) r++; else{ dp[i][r] = dp[l][i] + 1; if(dp[i][r] > ans) ans = dp[i][r]; l--;r++; } } } printf("%d\n",ans+2); return 0; }
相关文章推荐
- 51nod【1381】硬币游戏【思维】
- 51Nod—1717 好数(思维)
- 51Nod 1483 化学变换(思维+暴力)
- 51nod 1625 贪心/思维
- 51Nod 1055 最长等差数列
- 51nod 1717(思维)
- 51NOD 1519 拆方块(思维)
- 51Nod 1055 最长等差数列问题
- 51nod 1435 位数阶乘 (思维水题)
- 51nod 1421 最大MOD值(思维)
- 51NOD 1413 权势二进制(思维)
- 51Nod - 1055:最长等差数列 (求最长的等差数列)
- 51nod 1069【思维】
- 51Nod-1003 阶乘后面0的数量【分析思维】
- 51NOD - 1596 搬货物 | CF587 A. Duff and Weight Lifting【思维+二进制】
- 51nod 1413 权势二进制 (思维+贪心)
- 51nod 1287 加农炮 思维
- 51nod 1305 Pairwise Sum and Divide【思维】
- 51nod 1444 破坏道路【思维+最短路+枚举】这种题好套路啊
- 51nod 1478 括号序列的最长合法子段【思维+前缀和+优先队列】好题!