UVA 11584 Paritioning by Palindromes(动态规划 回文)
题目大意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串。比如racecar本身就是回文串;fastcar只能分成7个单字母的回文串;aaadbccb最少可分成3个回文串:aaa、d、bccb。字符串的长度不超过1000。
分析:令dp[i]表示从第1个到第 i 个字符所组成的最少回文串数。
我们考虑如果前k个字符构成了1个回文,那么前k+1个字符最多构成2个回文,如果这些字符都相同,那么也只是1个回文串。所以如果第 j 个字母到第 i 个字母能构成回文,那么dp[i] = min(dp[i],dp[j-1]+1);
初始条件是:dp[i]=i;
代码如下:
1 # include<cstdio> 2 # include<cstring> 3 # include<iostream> 4 using namespace std; 5 char s[1005]; 6 int dp[1005]; 7 bool judge(int i,int j){ 8 for(int k=0;k<=(j-i)/2;k++) 9 if(s[i+k] != s[j-k]) 10 return false; 11 return true; 12 } 13 int main(){ 14 int T,i,j,len; 15 scanf("%d",&T); 16 while(T--){ 17 scanf("%s",s); 18 dp[0] = 0; 19 len =strlen(s); 20 for(i=1; i<=strlen(s);i++){ 21 dp[i] = i; 22 for(j=1;j<=i;j++){ 23 if(judge(j-1,i-1)) 24 dp[i] = min(dp[i],dp[j-1]+1); 25 } 26 } 27 printf("%d\n",dp[len]); 28 } 29 return 0; 30 }
把每一件简单的事情做好,就是不简单;把每一件平凡的事情做好,就是不平凡!相信自己,创造奇迹~~