51nod 1055 最长等差数列
2016-12-01 22:39
274 查看
dp转移很神奇,枚举中间点。有点像floyd。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;
short int dp[MAXN][MAXN];
int a[MAXN];
int main()
{
int n,i,j,k,ans;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
dp[i][j]=2;
for(j=1;j<=n;j++)
{
i=j-1;k=j+1;
for(;i>=1&&k<=n;)
{
if(a[i]+a[k]==(a[j]<<1))
{
dp[j][k]=dp[i][j]+1;
i--;
k++;
}
else if(a[i]+a[k]<(a[j]<<1))
k++;
else
i--;
}
}
ans=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
ans=max(ans,(int)dp[i][j]);
printf("%d\n",ans);
}
}
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;
short int dp[MAXN][MAXN];
int a[MAXN];
int main()
{
int n,i,j,k,ans;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
dp[i][j]=2;
for(j=1;j<=n;j++)
{
i=j-1;k=j+1;
for(;i>=1&&k<=n;)
{
if(a[i]+a[k]==(a[j]<<1))
{
dp[j][k]=dp[i][j]+1;
i--;
k++;
}
else if(a[i]+a[k]<(a[j]<<1))
k++;
else
i--;
}
}
ans=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
ans=max(ans,(int)dp[i][j]);
printf("%d\n",ans);
}
}
相关文章推荐
- 51nod-1055-最长等差数列(dp+优化)
- 51nod 1055 最长等差数列
- 51Nod 1055 最长等差数列
- [DP Hash] 51Nod 1055 最长等差数列
- 【51Nod】1055 最长等差数列 动态规划
- 51nod 1055:最长等差数列
- 【51nod 1055 & 1056】最长等差数列及V2 题解
- 51nod 1055:最长等差数列
- 51nod 1055 最长等差数列
- 51Nod 1055 最长等差数列问题
- 51nod 1055 最长等差数列
- 51nod 1055 最长等差数列
- 51nod 1055 最长等差数列
- 51nod 1055 最长等差数列
- 51Nod - 1055:最长等差数列 (求最长的等差数列)
- 1055 最长等差数列
- 51 nod 1055 最长等差数列(dp)
- [51nod 1056]最长等差数列V2
- 51nod 1241 特殊的排序(DP_找最长等差数列)
- 51 nod 1055 最长等差数列(DP)