[CQOI2007]塗色
阿新 • • 發佈:2021-07-10
[CQOI2007]塗色
題目描述
假設你有一條長度為 $5$ 的木版,初始時沒有塗過任何顏色。你希望把它的 $5$ 個單位長度分別塗上紅、綠、藍、綠、紅色,用一個長度為 $5$ 的字串表示這個目標:`RGBGR`。 每次你可以把一段連續的木版塗成一個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成 `RRRRR`,第二次塗成 `RGGGR`,第三次塗成 `RGBGR`,達到目標。 用盡量少的塗色次數達到目標。輸入輸出格式
輸入格式
輸入僅一行,包含一個長度為 $n$ 的字串,即塗色目標。字串中的每個字元都是一個大寫字母,不同的字母代表不同顏色,相同的字母代表相同顏色。輸出格式
僅一行,包含一個數,即最少的塗色次數。輸入輸出樣例
輸入樣例 #1
AAAAA
輸出樣例 #1
1
輸入樣例 #2
RGBGR
輸出樣例 #2
3
說明
$40\%$ 的資料滿足 $1\le n\le 10$。 $100\%$ 的資料滿足 $1\le n\le 50$。1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 const int N = 100; 7 int f[N][N], n; 8 char s[N]; 9 int main() 10 { 11 scanf("%s",s + 1); 12 n = strlen(s + 1); 13 14 for(int i = 1; i <= n; i++) f[i][i] = 1; 15 for(int len = 2; len <= n; len ++) 16 { 17 for(int l = 1;l + len - 1 <= n; l++) 18 { 19 int r = l + len - 1; 20 f[l][r] = len; 21 if(s[l] == s[r]) f[l][r] = min( f[l + 1][r] , f[l][r - 1]) ; 22 else 23 { 24 f[l][r] = f[l][r - 1] + 1; 25 for (int k = l + 1; k < r; k++) 26 { 27 f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r]); 28 } 29 } 30 } 31 } 32 printf("%d", f[1][n]); 33 return 0; 34 }