• 洛谷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
    ", f[1][len]);
        return 0;
    }

    谢谢收看, 祝身体健康!

  • 相关阅读:
    C++第三章习题
    C++第五章习题
    C++第八章习题
    C++第四章习题
    第八章 图形编程 笔记
    第五章 Windows程序设计 笔记
    [转]c++ 结构体和类的区别
    C++第二章习题
    C++第六章习题
    Ubuntu10.04中设置和修改root密码
  • 原文地址:https://www.cnblogs.com/yanxiujie/p/11345671.html
Copyright © 2020-2023  润新知