标签:
状态转移方程 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