HDU 4745 Two Rabbits

来源:互联网 发布:马丽 知乎 编辑:程序博客网 时间:2024/05/16 19:41

区间dp,仔细分析就会发现它让你求长度区间为n的最大回文子序列。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 2050;int a[maxn];int dp[maxn][maxn];int main(){    int n;    while(~scanf("%d",&n) && n){        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++){            scanf("%d",&a[i]);            dp[i][i]=1;        }        int kk=0;        for(int i=n;kk<n;i++){            a[i]=a[kk++];            dp[i][i]=1;        }        int N=2*n;        for(int k=1;k<n;k++){            for(int i=0;;i++){                int j=i+k;                if(j>=N) break;                int tmp;                if(a[i]==a[j]){                    tmp=dp[i+1][j-1]+2;                }                else{                    tmp=max(dp[i+1][j],dp[i][j-1]);                }                dp[i][j]=max(dp[i][j],tmp);            }        }        int Max=-1;        for(int i=0;i<n;i++){           int M=max(dp[i][i+n-1],dp[i][i+n-2]+1);           Max=max(M,Max);        }        printf("%d\n",Max);       // puts("");    }}


原创粉丝点击