有一个栅栏,它有 n 个柱子,现在要给柱子染色,有 k 种颜色可以染。
必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案。
* 分析:
* 1.这是一个典型的动态规划问题,我们一样从最后的情况开始讨论
* 2.设num[i]为有i个柱子的染色方案,他可以分为两种情况
* ·最后两根主子颜色相同:不能连续三根柱子颜色相同故最后两根柱子颜色选择有 k-1 种
* 总共的染色方案就有 num[i-2]*(k-1)种
* ·最后两根柱子颜色不同:那么左后一根柱子染色方案有 k-1 种
* 总共染色方案有 num[i-1]*(k-1) 种
* 3.综上所述,我们就得出了状态转换方程
* num[i] = num[i-2]*(k-1) + num[i-1]*(k-1)
* num[1] = k num[2] = k * k;
private int NumWays(int n, int k)
{
if (n == 0) return 0;
if (n == 1) return k;
if (n == 2) return k * k;
int pre = k;
int now = k * k;
for (int i = 3; i < n; i++)
{
int temp = now;
now = (temp + pre)*(k - 1);
pre = temp;
}
return now;
}