P1192 台阶问题
输入输出样例
输入 #1复制
5 2
输出 #1复制
8
总结目录
1 本题思路,搜索与dp的结合
1 搜索与dp的结合
本题暴搜很简单,不再多说。记忆化搜索的过程其实和DP的过程很类似,本质都是定义一个状态后,利用定义好的记忆状态取拓展后续的过程。
代码
#include<iostream>
#include<cstring>
using namespace std;
int n, k;
int ans;
#define MOD 100003
#define maxsize 100005
int mark[maxsize];//mark[i]表示从第i级到第n级有多少方法
//暴力搜
void dfs(int cur) {
if (cur > n) {
return;
}
if (cur == n) {
ans++;
return;
}
for (int i = 1; i <= k; i++) {
dfs(cur + i);
}
}
//打表搜,记忆化
int dfs2(int cur) {
//返回从cur到n有多少种方法
if (mark[cur] != -1) {
return mark[cur];
}
if (cur > n) {
return 0;
}
if (cur == n) {
return 1;//这里的含义是如果cur+i==n,即从cur可以一步跨到,那么就只有一种方法,所以返回1
}
//如果没有记录,那么就要计算结果
int res=0;
for (int i = 1; i <= k; i++) {
if (cur + i <= n) {
res += dfs2(cur + i);
}
if (cur + i > n)break;
}
mark[cur] = res%MOD;//计算过程中要mod,否则会溢出
return mark[cur];
}
int main() {
cin >> n >> k;
//dfs(0);//暴力搜
memset(mark, -1, sizeof(mark));
mark[n] = 1;
for (int i = n; i >= 0; i--) {
dfs2(i);
}
ans = mark[0]%MOD;
cout << ans;
return 0;
}