码迷,mamicode.com
首页 > 其他好文 > 详细

CF286-C

时间:2015-02-13 13:15:12      阅读:449      评论:0      收藏:0      [点我收藏+]

标签:

状态转移方程 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;
}

 

CF286-C

标签:

原文地址:http://www.cnblogs.com/wzsblogs/p/4290043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!