( 1<N<50,2≤M≤5)
由于本题的时间限制,采用一般的深度优先搜索会严重超时,本人已经试过,而且由于1<N<50,
所以数据要用到64位整型。
我们这题的思路是采用记忆化搜索来解决这个问题,记忆化搜索有点动态规划的意思,
是介于动态规划和深度优先搜索的一种方法。
我们先建立一个长整形的二维数组 f[i][j], 代表代表第 i 个坑前有 j 个连续,
由题我们知道 f[i][m] = 0,f[n][j] = 1。
说到这里就可以写程序了。
#include<stdio.h>
#include<string.h>
long long f[50][10]; //f[i][j]代表第i个坑前有j个连续
int m, n;
long long dfs(int i, int j){
if (j == m)
return 0;
if (i == n)
return 1;
if (f[i][j] != -1)
return f[i][j];
long long t = 0;
t += dfs(i + 1, j + 1); //选中这个数
t += dfs(i + 1, 0); //未选这个数
return f[i][j] = t;
}
int main(){
scanf("%d%d", &n, &m);
memset(f, -1, sizeof(f));
dfs(0, 0);
printf("%lld\n", f[0][0]);
return 0;
}
推荐一个公众号,不吐槽,不毒舌,偶尔发发文章,偶尔推荐好物,欢迎关注或者有女票的程序狗们推荐给女票