bzoj 1260涂色 题解
区间dp, 我学的也不怎么好。
myj说动态规划就是搜索的无限剪枝。
所以是搜了网上的代码, 看了看。
思路就是枚举区间,f数组就是存储从i到j需要的最少次数, 当然一开始他们的值要先设置一个很大的值, 单独的区间也就是他自己这个点赋初值为1, 表示涂好这个只需要一次。
如果这两个区间的边界是一样的颜色直接用i + 1到j和i到j - 1这两个位置更新, 如果这两个区间的边界的颜色并不一样, 那就分成两段枚举k, 然后合并区间。
动规的代码一般不会太冗杂(我理解的是这样), 仔细想想其实也是能明白的, 主要是要多做题
#include <iostream> #include <cstdio> #include <cstring> #define N 60 using namespace std; char ch[N]; int f[N][N]; int main () { scanf ("%s", ch + 1); int len = strlen (ch + 1); memset (f, 0x3f3f, sizeof (f)); for (int i = 1; i <= len; i++) f[i][i] = 1; for (int l = 2; l <= len; l++) for (int i = 1; i + l - 1 <= len; i++) { int j = i + l - 1; if (ch[i] == ch[j]) f[i][j] = min (f[i + 1][j], f[i][j -1]); else for (int k = i; k < j; k++) f[i][j] = min (f[i][j], f[i][k]+ f[k + 1][j]); } printf ("%d\n", f[1][len]); return 0; }