LeetCode 276:栅栏涂色

导读:本篇文章讲解 LeetCode 276:栅栏涂色,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目
在这里插入图片描述

思路:动态规划

  • 状态:即栅栏的索引位置和 是否与上一个同色, 两种状态;

  • dp定义dp[i][0] 指 第 i 个栅栏与第 i-1个栅栏同色的颜色可能性,dp[i][1]指第 i 个栅栏与上一个不同色的颜色可能性

  • 选择
    此题没有求最大 或者 最小,而是列出所有的可能性!
    根据题意,dp[i][0]即和上一个同色,由于同一个颜色只能相邻两次,那么第 i-1个栅栏注定不能和上一个(i-2)同色! 所以 dp[i][0]=dp[i-1][1]
    dp[i][1]指 i 和 i-1不同色,那么 i-1位置的栅栏 既可以与i-2同色也可以与i-2不同色,且此时 i栅栏可以有 k-1种颜色可选;

  • base case
    从 i=1 开始算,dp[1][0]=0 即第一次不可能和上次相同;
    dp[1][1]=k 即第一次有k种可能性;

注意: 计算的是可能性的总和,所以结果是dp[n][0] + dp[n][1] ,而不是算的最大值or最小值;

public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int k=in.nextInt();
        if(k==1){
            if(n>0 && n<=2){
                System.out.println(1);
            }else{
                System.out.println(0);
            }

        }else {

            // dp定义
            int[][] dp = new int[n + 1][2];
            // base case
            // 0不算
            dp[0][0] = 0;
            dp[0][1] = 0;
            // 第一个和前面相同的可能性0
            dp[1][0] = 0;
            // 第一个和前面不同的可能性k
            dp[1][1] = k;

            for (int i = 2; i <= n; i++) { // 遍历栅栏索引
                // 和之前相同可能性1, 第i-1次只能是和上次不同
                dp[i][0] = dp[i - 1][1];
                // 和之前不同:要么第i-1此也不同 or 第i-1次与上次相同,然后再乘 k-1种可能性
                dp[i][1] = (dp[i - 1][1] + dp[i - 1][0]) * (k - 1);

            }
            int r = dp[n][0] + dp[n][1];
            System.out.println(r);
        }

    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89199.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!