我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。
注意事项:
n和k都是非负整数
样例:
n = 3, k = 2, return 6
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
思路:
状态转换方程为:
dp[i]=dp[i−1]∗(k−1)+dp[i−2]∗(k−1)
#ifndef C514_H
#define C514_H
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
/*
* @param n: non-negative integer, n posts
* @param k: non-negative integer, k colors
* @return: an integer, the total number of ways
*/
int numWays(int n, int k) {
// write your code here
if (n == 0 || k == 0)
return 0;
if (k == 1 && n >= 3)
return 0;
if (n == 1)
return k;
if (n == 2)
return k*k;
vector<int> dp(n + 1, 0);
dp[1] = k;
dp[2] = k*k;
for (int i = 3; i <= n; ++i)
{
dp[i] = dp[i - 1] * (k-1) + dp[i - 2]*(k-1);
}
return dp[n];
}
};
#endif