jQuery火箭图标返回顶部代码 - 站长素材
jQuery火箭图标返回顶部代码 - 站长素材

洛谷P4170 [CQOI2007]涂色题解

废话:

这个题我第一眼看就是贪心呐, 可能是我之前那做过一道类似的题这俩题都是关于染色的

现在由于我帅气无比的学长的指导, 我已经豁然开朗, 这题贪心不对啊,

 

 

当时感觉自己好厉害贪心都能想出来

差点就觉得自己感动中国了

现在感觉自己仿佛是个zz

但是50分的话, 还是比较可观的(我在瞎说不要信

 

正文:

区间DP, 枚举区间 ,分为两个情况讨论

第一种情况:你现在枚举的这个区间[i, j], 两边的颜色是一样的那么就从[i + 1. j]和[i, j - 1]里面选择较小的那一个

第二种情况:就是两边颜色不一样的情况, 直接枚举一个k合并区间即可

最后一定要注意:

f数组一定要初始化!

 memset (f, 0x3f3f3f, sizeof (f));
 for (int i = 1; i <= len; i++)
   f[i][i] = 1;

AC程序(我真的很喜欢自己的码风,等待挨喷):

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 110;
char ch[N];
int f[N][N], len;
int main () {
    scanf ("%s", ch + 1);
    len = strlen (ch + 1);
    memset (f, 0x3f3f3f, 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;
}

谢谢收看, 祝身体健康!

posted @ 2019-08-13 14:25  lzpclxf  阅读(262)  评论(7编辑  收藏  举报