hdu4632 Palindrome subsequence 区间DP
hdu4632 多校4场题目 区间dp
定义变量 f[i][j],表示 在区间 i到j的回文串的个数(注:i,j为字符串下标)
则 对于区间i- j 如果s[i]==s[j] f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+f[i +1][j-1]+1=f[i+1][j]+f[i][j+1]+1;
如果 s[i]!=s[j] 那么 f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1];
代码如下:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<string> 6 using namespace std; 7 #define MAX 1010 8 #define M 10007 9 int f[MAX][MAX]; 10 void init() 11 { 12 memset(f,0,sizeof(f)); 13 for(int i=0;i<MAX;i++) 14 f[i][i]=1; 15 } 16 int main() 17 { 18 string s; 19 int t; 20 cin>>t; 21 int k=1; 22 while(t--) 23 { 24 cin>>s; 25 int n=s.length()-1; 26 init(); 27 for(int j=0;j<=n;j++) 28 for(int i=j-1;i>=0;i--) 29 { 30 if(s[i]==s[j]) f[i][j]=(f[i+1][j]+f[i][j-1]+1)%M; 31 else 32 if(s[i]!=s[j]) f[i][j]=(f[i][j-1]+f[i+1][j]-f[i+1][j-1]+M)%M; 33 } 34 cout<<"Case "<<k++<<": "<<f[0][n]<<endl; 35 } 36 return 0; 37 }