题目
题解
很有意思, 重点看左右端点:
- 左右端点不同:说明不能一次将颜色染完,于是枚举断点,比较左右两段加起来次数最少的。
- 左右端点相同:那么比较
f[l][r - 1], f[l + 1][r]
(去掉一个端点)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000;
char a[N];
int f[N][N];
int main() {
memset(f, 0x3f, sizeof f);
scanf("%s", a);
int n = strlen(a);
for(int i = 0; i < n; i ++) f[i][i] = 1;
for(int len = 2; len <= n; len ++) {
for(int l = 0; l + len - 1 < n; l ++) {
int r = l + len - 1;
if(a[l] == a[r]) {
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", f[0][n - 1]);
return 0;
}