这道题应该背下来,是经典的DP问题,类似爬楼梯问题(题目有问题,应该是不可以连续三个柱子相同)。
当n==1时,有k种方案;
当n==2时,有k*k种方案;
当n==3时,分两种情况:
1:后两根颜色相同(有num[1] * (k-1)=k*(k-1)种方案)
2:后两根颜色不同(有num[2]*(k-1) = k*k*(k-1)种方案 )
以后num[i]表示前i根柱子的方案数,num[i-1],num[i-2]表示前i-1 和 i-2根柱子种方案数。因而可以用动态规划解决:
C++代码:
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 (n==1) return k;
if (n==2) return k*k;
if (k == 1) return 0;
int num[3];
num[1] = k;
num[2] = k*k;
int temp=num[2];
for(int i=3; i<=n; i++) {
temp = num[1] * (k-1) + num[2] * (k-1);
num[1] = num[2];
num[2] = temp;
}
return temp;
}
};