bzoj 1260
阿新 • • 發佈:2017-07-11
space 例如 page 字母 eof 100% hint using 沒有
Submit: 1430 Solved: 868
[Submit][Status][Discuss]
輸入僅一行,包含一個長度為n的字符串,即塗色目標。字符串中的每個字符都是一個大寫字母,不同的字母代表不同顏色,相同的字母代表相同顏色。
AAAAA
【樣例輸入1】
RGBGR
【樣例輸出1】
1
【樣例輸出1】
3
1260: [CQOI2007]塗色paint
Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1430 Solved: 868
[Submit][Status][Discuss]
Description
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅、綠、藍、綠、紅色,用一個長度為5的字符串表示這個目標:RGBGR。 每次你可以把一段連續的木版塗成一個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成RRRRR,第二次塗成RGGGR,第三次塗成RGBGR,達到目標。 用盡量少的塗色次數達到目標。Input
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 intdp[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