BZOJ_1260_[CQOI2007]塗色paint _區間DP
阿新 • • 發佈:2018-03-06
i++ 次數 using size print AC 每次 post 字符串表
BZOJ_1260_[CQOI2007]塗色paint _區間DP
題意:
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅、綠、藍、綠、紅色,用一個長度為5的字符串表示這個目標:RGBGR。 每次你可以把一段連續的木版塗成一個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成RRRRR,第二次塗成RGGGR,第三次塗成RGBGR,達到目標。 用盡量少的塗色次數達到目標。
分析:
f[i][j]表示從i到j染色最少需要多少次
分a[i]==a[j]討論一下
代碼:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; #define N 60 int f[N][N],n,a[N]; char b[N]; int main(){ scanf("%s",b+1); int n=strlen(b+1); int i,j,k,l; for(i=1;i<=n;i++)a[i]=b[i]-‘A‘+1; memset(f,0x3f,sizeof(f)); for(i=1;i<=n;i++)f[i][i]=1; for(l=2;l<=n;l++){ for(i=1;i+l-1<=n;i++){ j=i+l-1; if(a[i]==a[j]){ f[i][j]=min(f[i+1][j],f[i][j-1]); f[i][j]=min(f[i][j],f[i+1][j-1]+1); }else{ for(k=i;k<j;k++){ f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); } } } } printf("%d\n",f[1][n]); }
BZOJ_1260_[CQOI2007]塗色paint _區間DP