动态规划-计数-514. 栅栏染色
2020-04-27 21:15:58
问题描述:
我们有一个栅栏,它有n
个柱子,现在要给柱子染色,有k
种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。
样例
例 1:
输入: n=3, k=2
输出: 6
Explanation:
post 1, post 2, post 3
way1 0 0 1
way2 0 1 0
way3 0 1 1
way4 1 0 0
way5 1 0 1
way6 1 1 0
例 2:
输入: n=2, k=2
输出: 4
Explanation:
post 1, post 2
way1 0 0
way2 0 1
way3 1 0
way4 1 1
注意事项
n
和k
都是非负整数
问题求解:
按最后两个柱子颜色是否相同进行划分。
若最后两个颜色不同共(k - 1) * dp[i - 1]种,若最后两个颜色相同共(k - 1) * dp[i - 2]种。
时间复杂度:O(n)
public int numWays(int n, int k) { if (n == 1) return k; if (n == 2) return k * k; int[] dp = new int[n + 1]; dp[1] = k; dp[2] = k * k; for (int i = 3; i <= n; i++) dp[i] = (k - 1) * dp[i - 2] + (k - 1) * dp[i - 1]; return dp[n]; }