设f[i][0]表示取了i个数最前面的数为0的合法数的数量,f[i][1]表示取了i个数最前面的数不为0的合法数的数量
则
f[i][0] = f[i - 1][1]
f[i][1] = (k - 1) * (f[i - 1][0] + f[i - 1][1])
边界条件
f[1][0] = 1
f[1][1] = k - 1
(代码中习惯性地使用dp作为数组名,不用在意)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL dp[20][20];
int main() {
int n, k;
scanf("%d%d", &n, &k);
dp[1][0] = 1;
dp[1][1] = k - 1;
for (int i = 2; i <= n - 1; i++) {
dp[i][0] = dp[i - 1][1];
dp[i][1] = (k - 1) * (dp[i - 1][0] + dp[i - 1][1]);
}
printf("%lld\n", (k - 1) * (dp[n - 1][0] + dp[n - 1][1]));
return 0;
}