标签:
状态转移方程 dp[pos][len]=max(dp[pos+len-1][len-1],dp[pos+len][len],dp[pos+len+1][len+1])+a[pos]
pos和len的范围都是1~30000故不可能开这么大的数组,故对于len>2000,由于状态数比较少,直接dfs就可以了
#include <iostream>
#include <string.h>
using namespace std;
int a[30010];
int n,d;
int Max=-1;
int dp[30010][2010];
int dfs(int l,int len)
{
if(l>Max)
return 0;
int cnt;
if(len>1)
{
cnt=max(max(dfs(l+len-1,len-1),dfs(l+len,len)),dfs(l+len+1,len+1))+a[l];
cnt=max(cnt,a[l]);
}
return cnt;
}
int DP( int i , int l ) {
if( i > Max ) return 0 ;
if( dp[i][l] == -1 ) {
int &tmp = dp[i][l] ; tmp = a[i];
if( l > 1 ) tmp = max( tmp , a[i] + DP( i + l - 1 , l - 1 ) );
tmp = max( tmp , a[i] + DP( i + l , l ) );
tmp = max( tmp , a[i] + DP( i + l + 1 , l + 1 ) );
}
return dp[i][l];
}
int main()
{
cin>>n>>d;
memset( dp , -1 , sizeof dp ) ;
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
a[k]++;
Max=max(Max,k);
}
if(d>2000)
cout<<dfs(d,d)<<endl;
else
cout<<DP(d,d)<<endl;
return 0;
}
标签:
原文地址:http://www.cnblogs.com/wzsblogs/p/4290043.html