描述:
我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。
注意事项:n和k都是非负整数
样例:
n = 3, k = 2, return 6
post1, post2, post3
way1 0, 0, 1
way2 0, 1, 0
way3 0, 1, 1
way4 1, 0, 0
way5 1, 0, 1
way6 1, 1, 0
思路:
由题意,第n个栅栏的染色方法只与第n-1根栅栏的颜色和第n-2根栅栏的颜色有关:
1.第n根栅栏与第n-1根栅栏颜色相同,与第n-2根栅栏颜色不同,f(n)=f(n-2)*(k-1);
2.第n根栅栏与第n-1根栅栏颜色不同,f(n)=f(n-1)*(k-1);
由于计算递归,为减小时间复杂度,这里采用记忆搜索。
AC代码:
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
int f[9999999];
f[0]=0;f[1]=k;f[2]=k*k;
for(int i=3;i<=n;i++)
f[i]=f[i-2]*(k-1)+f[i-1]*(k-1);
return f[n];
}
};