1. 程式人生 > >BZOJ_1260_[CQOI2007]塗色paint _區間DP

BZOJ_1260_[CQOI2007]塗色paint _區間DP

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