栅栏染色问题

有一个栅栏,它有 n 个柱子,现在要给柱子染色,有 k 种颜色可以染。

必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。

     * 分析:
     *      1.这是一个典型的动态规划问题,我们一样从最后的情况开始讨论
     *      2.设num[i]为有i个柱子的染色方案,他可以分为两种情况
     *         ·最后两根主子颜色相同:不能连续三根柱子颜色相同故最后两根柱子颜色选择有 k-1 种
     *              总共的染色方案就有 num[i-2]*(k-1)种
     *         ·最后两根柱子颜色不同:那么左后一根柱子染色方案有 k-1 种
     *              总共染色方案有 num[i-1]*(k-1) 种
     *      3.综上所述,我们就得出了状态转换方程
     *          num[i] = num[i-2]*(k-1) + num[i-1]*(k-1)

     *          num[1] = k      num[2] = k * k;

    private int NumWays(int n, int k)
    {
        if (n == 0) return 0;
        if (n == 1) return k;
        if (n == 2) return k * k;
        int pre = k;
        int now = k * k;
        for (int i = 3; i < n; i++)
        {
            int temp = now;
            now = (temp + pre)*(k - 1);
            pre = temp;
        }
        return now;
    }

猜你喜欢

转载自blog.csdn.net/wenbooboo/article/details/81034529