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]); }