BZOJ1260[CQOI2007]涂色paint 区间DP
Description
给定一个空白木板,你一次可以把一个区间的木板改成一中颜色,
问要求变成给定颜色的木板最少要多少次染色。
题解
这是典型的区间DP,
根据套路 ,我们可以得到dp式
如果c[l]==c[r] f[l][r]=min(f[l+1][r],f[l][r-1])
f[l][r]=min(f[l][k]+f[k+1][r])
#include <cstdio>
#include <iostream>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <climits>
#define MAXN 1000
using namespace std;
char c[MAXN];
int n,f[MAXN][MAXN];
int main()
{
scanf("%s",c+1);
n=strlen(c+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=i==j?1:(~(1<<31));
for(int len=1;len<=n;len++)
for(int l=1,r;(l+len-1)<=n;l++)
{
r=l+len-1;
if(c[l]==c[r])
{
if(l==r) f[l][r]=1;
else f[l][r]=min(f[l][r-1],f[l+1][r]);
}else
for(int k=l;k<r;k++) f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);
}
printf("%d\n",f[1][n]);
return 0;
}