UVA 11584 Paritioning by Palindromes(動態規劃 迴文)

賈樹丙發表於2013-07-26

題目大意:輸入一個由小寫字母組成的字串,你的任務是把它劃分成儘量少的迴文串。比如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 }

 

相關文章