1. 程式人生 > >bzoj1260 [CQOI2007]塗色paint

bzoj1260 [CQOI2007]塗色paint

顏色 覆蓋 span sin led can cstring color pac

1260: [CQOI2007]塗色paint

Time Limit: 30 Sec Memory Limit: 64 MB

Description

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

Input

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

Output

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

Sample Input

Sample Output

【樣例輸入1】
AAAAA

【樣例輸入1】
RGBGR

【樣例輸出1】
1

【樣例輸出1】
3

Tips:   記憶化搜索,每次判斷2個端點就行了; Code:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define INF 100000008
using namespace std;
int n,m,dp[58][58],len;
char
s[10008]; int dfs(int l,int r){ if(l>r) return 0; if(l==r) return 1; if(dp[l][r]!=INF) return dp[l][r]; for(int i=l;i<r;i++){ dp[l][r]=min(dp[l][r],dfs(l,i)+dfs(i+1,r)-(s[l]==s[r])); } return dp[l][r]; } int main(){ scanf("%s",s); int len=strlen(s); n
=len; for(int i=len;i>0;i--) s[i]=s[i-1]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=INF; printf("%d",dfs(1,n)); }

bzoj1260 [CQOI2007]塗色paint