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; }
原文:http://blog.csdn.net/huntinggo/article/details/20771857