BZOJ1260[CQOI2007]涂色paint (区间DP)

来源:互联网 发布:江湖婚庆 3.0源码 编辑:程序博客网 时间:2024/05/22 12:55

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 1000using 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;}