1. 程式人生 > 其它 >[CQOI2007]塗色

[CQOI2007]塗色

[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 }