标签:ane cas desc class nts color namespace letter only
4 a aaaaa goodafternooneveryone welcometoooxxourproblemsSample Output
Case 1: 1 Case 2: 31 Case 3: 421 Case 4: 960
这里的子串不需要连续,区间dp,首先每个字符都是长度为1的回文串,然后确定长度为i的连续子串里有多少回文串(i>=2),这样长度为i的子串可以由它的长度为i-1的子串来更新。
代码:
#include <iostream> #include <cstring> #include <cstdio> #define Max 1002 using namespace std; int t,dp[Max][Max]; char s[Max]; int main() { scanf("%d",&t); int k = 1; for(int i = 1;i <= 1001;i ++) dp[i][i] = 1;///从i到i长度为1的一个字符是长度为1的 while(t --) { scanf("%s",s); int len = strlen(s); for(int i = 1;i <= len - 1;i ++) { for(int j = 1;j + i <= len;j ++)///j表示从i开始的子串长度 { dp[j][i + j] = dp[j + 1][i + j] + dp[j][i + j - 1] - dp[j + 1][i + j - 1];///[a,b]区间的用[a+1,b] 和 [a,b-1]区间的更新,这两个区间肯定会较早就确定 但是他们都包含了[a+1,b-1] if(s[j - 1] == s[i + j - 1])dp[j][i + j] += dp[j + 1][i + j - 1] + 1;///如果边界两个字符相同那么这两个字符可以组成一个回文串 同时 区间内的回文串加上这两个字符又形成新的回文串 dp[j][i + j] = (dp[j][i + j] + 10007) % 10007; } } printf("Case %d: %d\n",k ++,dp[1][len]); } }
hdu 4632 Palindrome subsequence
标签:ane cas desc class nts color namespace letter only
原文地址:https://www.cnblogs.com/8023spz/p/9061434.html