hdu 4745 动态规划

思路:特水的一个最长回文子序列动态规划。比赛时硬卡第一题,49WA后终于AC,可惜没时间做这题,结果成绩也就可想而知了。兔子跳一样权值的石头,并且一个正跳,一个反跳,这不就是个回文子序列吗?????!!!!

#include<set>

#include<map>

#include<cmath>

#include<queue>

#include<cstdio>

#include<vector>

#include<string>

#include<cstdlib>

#include<cstring>

#include<iostream>

#include<algorithm>

#define pb push_back

#define mp make_pair

#define Maxn 1010

#define Maxm 200010

#define LL __int64

#define Abs(x) ((x)>0?(x):(-x))

#define lson(x) (x<<1)

#define rson(x) (x<<1|1)

#define inf 100000

#define lowbit(x) (x&(-x))

#define clr(x,y) memset(x,y,sizeof(x))

#define Mod 1000000007

using namespace std;

int dp[Maxn][Maxn],num[Maxn];

int main()

{

    int n,i,j;

    while(scanf("%d",&n),n){

        clr(dp,0);

        for(i=1;i<=n;i++){

            scanf("%d",num+i);

            dp[i][i]=1;

        }

        for(i=1;i<=n;i++){

            for(j=i-1;j>=1;j--){

                dp[i][j]=max(dp[i-1][j],dp[i][j+1]);

                if(num[i]==num[j])

                    dp[i][j]=dp[i-1][j+1]+2;

            }

        }

        int ans=0;

        for(i=1;i<=n;i++)

            ans=max(ans,dp[i][1]+dp[n][i+1]);

        printf("%d\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(动态规划)