51 nod 1055 最长等差数列(DP)
2017-10-14 10:52
225 查看
1055 最长等差数列
![](http://file.51nod.com/images/icon/ok.png)
基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题
![](http://file.51nod.com/images/icon/star.png)
收藏
![](http://file.51nod.com/images/icon/plus.png)
关注
N个不同的正整数,找出由这些数组成的最长的等差数列。
例如:1 3 5 6 8 9 10 12 13 14
等差子数列包括(仅包括两项的不列举)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14
其中6 8 10 12 14最长,长度为5。
Input
Output
Input示例
Output示例
解:利用了等差数列的一个性质 a<b<c -> a+c=2*b
那么能构成等差数列的三项 如果确定了两项 那么第三项是唯一的 两个指针 向两边遍历 就好
dp[i][j]表示以i,j为两端的区间的能够往前延伸的最大长度
C++ & C short为一种数据类型,范围-32768~+32767。
2. 共有两种:
unsigned short i; i可以表示0~65535
signed(默认)short i; i可以表示-32768~+32767
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+2;
typedef long long LL;
short dp
;
int a
;
int main()
{
int n;
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),dp[i][i]=1;
sort(a+1,a+n+1);
short ans=1;
for(int i=1;i<=n;i++)
{
int l=i-1,r=i+1;
while(l>=1&&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]=max(dp[i][r],(short)(max((short)2,dp[l][i])+1));
ans=max(ans,dp[i][r]);
l--;
}
}
}
cout<<ans<<endl;
return 0;
}
![](http://file.51nod.com/images/icon/ok.png)
基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题
![](http://file.51nod.com/images/icon/star.png)
收藏
![](http://file.51nod.com/images/icon/plus.png)
关注
N个不同的正整数,找出由这些数组成的最长的等差数列。
例如:1 3 5 6 8 9 10 12 13 14
等差子数列包括(仅包括两项的不列举)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14
其中6 8 10 12 14最长,长度为5。
Input
第1行:N,N为正整数的数量(3 <= N <= 10000)。 第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)
Output
最长等差数列的长度。
Input示例
10 1 3 5 6 8 9 10 12 13 14
Output示例
5
解:利用了等差数列的一个性质 a<b<c -> a+c=2*b
那么能构成等差数列的三项 如果确定了两项 那么第三项是唯一的 两个指针 向两边遍历 就好
dp[i][j]表示以i,j为两端的区间的能够往前延伸的最大长度
C++ & C short为一种数据类型,范围-32768~+32767。
2. 共有两种:
unsigned short i; i可以表示0~65535
signed(默认)short i; i可以表示-32768~+32767
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+2;
typedef long long LL;
short dp
;
int a
;
int main()
{
int n;
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),dp[i][i]=1;
sort(a+1,a+n+1);
short ans=1;
for(int i=1;i<=n;i++)
{
int l=i-1,r=i+1;
while(l>=1&&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]=max(dp[i][r],(short)(max((short)2,dp[l][i])+1));
ans=max(ans,dp[i][r]);
l--;
}
}
}
cout<<ans<<endl;
return 0;
}
相关文章推荐
- 51 nod 1055 最长等差数列(dp)
- 51nod-1055-最长等差数列(dp+优化)
- [DP] 51 Nod 1274——最长递增路径
- 51 nod 1056 最长等差数列 V2
- [DP Hash] 51Nod 1055 最长等差数列
- 51 nod 1412 AVL树的种类(树形DP)
- 51nod 1055 最长等差数列
- 【二维dp】最长等差数列
- 子序列个数(51nod-1202)(dp)
- 51 nod 1306 高楼和棋子(反向思考的DP)@
- 【51nod 1055 & 1056】最长等差数列及V2 题解
- 51 nod 1610 路径计数(Moblus+dp)
- [DP]51 Nod——[1048 整数分解为2的幂 V2]
- 51nod 1055 最长等差数列
- 51 nod 1354 选数字(stl+dp)
- 数位DP (51nod)
- 51nod 1055 最长等差数列
- 51 nod 1022 石子归并 V2(dp决策单调性)
- 【最长上升子序列】51 nod 最长单增子序列
- 51 Nod 1051 最大子矩阵和 (DP)