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; }