洛谷P1192 台阶问题【记忆化搜索】

时间:2022-12-23 17:57:32

题目https://www.luogu.org/problemnew/show/P1192

题意:

给定n和k,一个人一次可以迈1~k步,问走n步有多少种方案。

思路:

本来傻乎乎上来就递归,显然会T的啊猪头!

然后改成记忆化搜索。dfs的参数就是还剩余的步数,num数组存的就是走i步的方案数。

 #include<stdio.h>
#include<stdlib.h>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue> #define inf 0x7f7f7f7f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n, k;
//int ans = 0;
const int mod = ;
const int maxn = 1e5 + ;
LL num[maxn]; LL dfs(int x)
{
if(x < )return ;
else if(num[x])return num[x];
else if(x == )return ; LL ans = ;
for(int i = ; i <= k; i++){
ans = (ans + dfs(x - i)) % mod;
}
num[x] = ans;
return num[x];
} int main()
{
memset(num, , sizeof(num));
scanf("%d%d", &n, &k);
printf("%lld\n", dfs(n)); return ;
}