标签:dp
给你一个字符串 让你求最大回文子序列的个数;dp【i】【j】表示i到j的最大回文子序列个数(注意是个数,就要有累加过程 如果是最大长度 就直接赋值)
首先dp【i】【j】=dp【i+1】【j】+dp【i】【j-1】 中间有重复的()就是与i+1余j-1无关的 所以还得减去dp【i+1】【j-1】
然后判断str【i】与str【j】是否相等,如果是再加上dp【i+1】【j-1】+1;
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; #define mod 10007 int dp[1010][1010]; int max(int a,int b) { return a>b?a:b; } int main() { int T,i,j,n,d=1; char str[1010]; scanf("%d",&T); while(T--) { scanf("%s",str); int len=strlen(str); memset(dp,0,sizeof(dp)); for(i=len-1;i>=0;i--) { for(j=i;j<len;j++) { dp[i][j]=(dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]+mod)%mod; if(str[i]==str[j]) dp[i][j]=(1+dp[i+1][j-1]+dp[i][j])%mod; } } printf("Case %d: %d\n",d++,dp[0][len-1]); } return 0; }
标签:dp
原文地址:http://blog.csdn.net/zxf654073270/article/details/45585227