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

猜你喜欢

转载自www.cnblogs.com/yanxiujie/p/11212369.html