题目大意:给一个全是小写字母的字符串,判断最少可分为几个回文子序列。如:“aaadbccb” 最少能分为 “aaa” “d” “bccb” 共三个回文子序列,又如 “aaa” 最少能分为 1 个回文子序列。
题目解析:状态转移方程 dp[i]=min(dp[j]+1) , 其中,j -> i 是回文子序列。dp[i]表示到标号为 i 的字符,最少可分为几个回文子序列。
现在想想,这道题并不算难!!!!!!!!
代码如下:
1 # include<iostream> 2 # include<cstdio> 3 # include<string> 4 # include<cstring> 5 # include<algorithm> 6 using namespace std; 7 int dp[1005]; 8 string p; 9 bool is(int x,int y) 10 { 11 while(x<y){ 12 if(p[x]!=p[y]) 13 return false; 14 ++x,--y; 15 } 16 return true; 17 } 18 void work() 19 { 20 int n=p.size(); 21 for(int i=0;i<n;++i){ 22 dp[i]=i+1; 23 for(int j=0;j<=i;++j){ 24 if(is(j,i)) 25 dp[i]=min(dp[j-1]+1,dp[i]); 26 } 27 } 28 printf("%d ",dp[n-1]); 29 } 30 int main() 31 { 32 int T; 33 scanf("%d",&T); 34 while(T--) 35 { 36 cin>>p; 37 work(); 38 } 39 return 0; 40 }