涂色PAINT
[CQOI2007]涂色PAINT
https://ac.nowcoder.com/acm/problem/19909
题意: 给定一个长度为的颜色序列
,初始颜色序列
无颜色每,次可以选择
使得
都变成一种颜色,问最少多少次可以使得整个区间变成给定的颜色序列
。
数据范围:,还是baidu才知道的~。
题解:
由于数据范围很小且涉及到区间操作,所以考虑区间。
表示将
涂成
状态转移:对:
- 当
,涂
时可以顺便把
涂了,涂
时可以顺便把
涂了,故此时
- 当
,此时没法一并涂颜色了,枚举
,故此时
- 代码:*
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
char s[N];
int f[N][N];
int main()
{
scanf("%s", 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 m = l; m + 1 <= r; m++) f[l][r] = min(f[l][r], f[l][m] + f[m + 1][r]);
}
printf("%d\n", f[1][n]);
return 0;
} 