bzoj1260 [CQOI2007]塗色paint
阿新 • • 發佈:2017-09-17
顏色 覆蓋 span sin led can cstring color pac
僅一行,包含一個數,即最少的塗色次數。
AAAAA
【樣例輸入1】
RGBGR
【樣例輸出1】
1
【樣例輸出1】
3
Tips: 記憶化搜索,每次判斷2個端點就行了; Code:
1260: [CQOI2007]塗色paint
Time Limit: 30 Sec Memory Limit: 64 MBDescription
假設你有一條長度為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; chars[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