#include <iostream>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include<cstdlib>
int main()
{
int n,k;
cin >> n >>k;
int* memory = new int[n + 1]{0};
// base case
memory[1] = k;
memory[2] = k*(k-1);
memory[3] = k * (k - 1) * (k - 2);
// 根据分析,对一些特例进行处理
if (n == 1 && k >= 1) {
cout << k;
return 0;
}
else if (n >= 3 && n % 2 == 1 && k < 3) {
cout << 0;
return 0;
}
else if (n % 2 == 0 && k == 1) {
cout << 0;
return 0;
}
else {
// 从4开始填表到n,对于某个memory[i],有两种情况
// 当1位置与n-1位置同色,n位置就有k-1种选择,n位置颜色选定,1与n-1位置同色捆绑,即可当做一个色块与其他色块重新选色
// 当1位置与n-1位置不同色,n位置就有k-2种选择,n位置颜色选定,其他n-1个色块即需重新选色
for (int i = 4;i<=n; i++) {
memory[i] = (k - 1) * memory[i - 2] + (k-2) * memory[i - 1];
}
}
//最后输出 memory[n]即可
printf("%d",memory[n]);
return 0;
}
10304 平面域着色
最新推荐文章于 2024-09-27 11:50:10 发布