标签:
Description
Input
Output
Sample Input
1 1 4 1 1 2 1 6 2 1 1 2 1 3 0
Sample Output
1 4 5
居然求环的回文串还可以这么玩~~
本题题意是:一个环,两只兔子一只顺时针走,一只逆时针走,从头一个起点开始,每步两只都需要选择相同的数,最多走一圈,问最多走几步?
开始以为是求最多的点数==然后遇到环就想把环倍增,然而依旧不会。题解说是求出1-n的dp[i][j]值为区间内的回文串长度,然后把串分成两半,两边求和取最大值即可。为什么呢?将两侧子串的回文中点都可以当做开始的点,就是这里,我又读错题了,我以为起点是同一个石头。。。纠结了半天,用ac代码读入回文串的长度是偶数的情况,结果和我想的不一样才又看的==
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int num[2009],dp[1009][1009],n; int main() { while(~scanf("%d",&n)&&n) { for(int i=1;i<=n;i++)scanf("%d",&num[i]); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) dp[i][i]=1; for(int len=1;len<=n;len++) { for(int l=1;l+len<=n;l++) { int r=l+len; if(num[l]==num[r]) dp[l][r]=dp[l+1][r-1]+2; else dp[l][r]=max(dp[l+1][r],dp[l][r-1]); } } int ans=1; for(int i=1;i<n;i++) if(ans<dp[1][i]+dp[i+1][n]) ans=dp[1][i]+dp[i+1][n]; printf("%d\n",ans); } return 0; }
HDU 4745 Two Rabbits【非连续最长回文子序列,区间DP】
标签:
原文地址:http://blog.csdn.net/zhou_yujia/article/details/51332671