1. 程式人生 > >bzoj 1260

bzoj 1260

space 例如 page 字母 eof 100% hint using 沒有

1260: [CQOI2007]塗色paint

Time Limit: 30 Sec Memory Limit: 64 MB
Submit: 1430 Solved: 868
[Submit][Status][Discuss]

Description

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅、綠、藍、綠、紅色,用一個長度為5的字符串表示這個目標:RGBGR。 每次你可以把一段連續的木版塗成一個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成RRRRR,第二次塗成RGGGR,第三次塗成RGBGR,達到目標。 用盡量少的塗色次數達到目標。

Input

輸入僅一行,包含一個長度為n的字符串,即塗色目標。字符串中的每個字符都是一個大寫字母,不同的字母代表不同顏色,相同的字母代表相同顏色。

Output

僅一行,包含一個數,即最少的塗色次數。

Sample Input

Sample Output

【樣例輸入1】
AAAAA

【樣例輸入1】
RGBGR

【樣例輸出1】
1

【樣例輸出1】
3


HINT

40%的數據滿足:1<=n<=10
100%的數據滿足:1<=n<=50

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int
dp[55][55]; 5 char s[55]; 6 7 int main(){ 8 scanf("%s",s+1); 9 int n=strlen(s+1); 10 memset(dp,127,sizeof(dp)); 11 for(int i=1;i<=n;i++) dp[i][i]=1; 12 for(int l=1;l<n;l++){ 13 for(int i=1;i<=n;i++){ 14 int j=i+l; 15 if(j>n) break
; 16 if(s[i]==s[j]){ 17 if(l==1) dp[i][j]=1; 18 else { 19 dp[i][j]=min(dp[i][j-1],dp[i+1][j]); 20 dp[i][j]=min(dp[i][j],dp[i+1][j+1]+1); 21 } 22 } 23 else { 24 for(int k=i;k<j;k++){ 25 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); 26 } 27 } 28 } 29 } 30 cout<<dp[1][n]<<endl; 31 }

bzoj 1260