K好数
动态规划, 好久没做了, 想了一段时间才将这个题目想出来!
每一位选择时候可以根据上一位的情况来选择, 该位必须满足与上一位不相邻,从而可以得到递推式:
dp[i][j] = dp[i - 1][m] +dp[i][j]; 其中的m 是(0 <= m < k && abs(m - j) != 1)
那么这个题目就出来了:
附代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define NUM 1000000007
int dp[110][110];
int main(){
int k, l;
int i, j, m;
int sum;
scanf("%d %d", &k, &l);
for(i = 0; i < k; i++){
dp[1][i] = 1;
}
for(i = 2; i <= l; i++){
for(j = 0; j < k; j++){
for(m = 0; m < k; m++){
if(abs(m - j) != 1){
dp[i][j] = (dp[i][j] + dp[i - 1][m]) % NUM;
}
}
}
}
sum = 0;
for(i = 1; i < k; i++){
sum = (sum + dp[l][i]) % NUM;
}
printf("%d\n", sum);
return 0;
}