普及组递归递推:P1192 台阶问题——记忆化与DP结合

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值