我们有一个栅栏,它有
public class Solution {
/**
* @param n non-negative integer, n posts
* @param k non-negative integer, k colors
* @return an integer, the total number of ways
*/
public int numWays(int n, int k) {
// Write your code here
//题目应改为至多有两根相邻柱子颜色相同
if(k<1||n<1)
return 0;
if(n==1)//只有一根柱子时
return k;
if(n==2)
return k*k;//可以相同
int[] res= new int[n];
res[0]=k;
res[1]=k*k;
for(int i=2;i<n;i++)
res[i]=res[i-1]*(k-1)+res[i-2]*(k-1);
//当最后一根柱子跟前一根颜色相同时,有res[i-2]*(k-1)种方案
//当最后一根与前一根不同时,有res[i-1]*(k-1)种方案
return res[n-1];
}
}
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
/**
* @param n non-negative integer, n posts
* @param k non-negative integer, k colors
* @return an integer, the total number of ways
*/
public int numWays(int n, int k) {
// Write your code here
//题目应改为至多有两根相邻柱子颜色相同
if(k<1||n<1)
return 0;
if(n==1)//只有一根柱子时
return k;
if(n==2)
return k*k;//可以相同
int[] res= new int[n];
res[0]=k;
res[1]=k*k;
for(int i=2;i<n;i++)
res[i]=res[i-1]*(k-1)+res[i-2]*(k-1);
//当最后一根柱子跟前一根颜色相同时,有res[i-2]*(k-1)种方案
//当最后一根与前一根不同时,有res[i-1]*(k-1)种方案
return res[n-1];
}
}