[DP 区间] [CQOI2007]涂色

题目

[DP 区间] [CQOI2007]涂色_#include

思路

[DP 区间] [CQOI2007]涂色_i++_02
显然,i==j的时候为1
如果a[i]==a[j],那么可以直接在上一次一起染,反之要单独染
[DP 区间] [CQOI2007]涂色_i++_03
[DP 区间] [CQOI2007]涂色_#include_04
原本自己写的代码错误在于只考虑了最后一步,从l+1转移还是从r-1转移,实际上区间DP最后一个不能只考虑左右端点,而是要枚举分界点

代码

#include<iostream>
#include<string.h>
using namespace std;
typedef long long LL;
const int N=1005;
LL f[N][N];
char s[N];
int main()
{
cin >> s+1;
int n=strlen(s+1);
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;i++)f[i][i]=1;
for(int len=2;len<=n;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
if(s[l]==s[r])f[l][r]=min(f[l+1][r],f[l][r-1]);
else{
for(int k=l;k<r;k++)
f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);
}
}
}
cout << f[1][n]<< endl;
return 0;
}