地宫寻宝题解

本文介绍了一道蓝桥杯省选题,涉及DFS搜索和动态规划(DP)在解决地宫寻宝问题中的应用,通过记忆化减少重复计算,目标是获取尽可能多的物品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地宫寻宝

思路

一道蓝桥杯省选题,不是很难,只不过因为没加记忆化逝了……

DFSDFSDFS

爆搜肯定不行,会 TLETLETLE ,只能得 606060

有四种状态,拿,往下走,不拿,往下走,拿,往右走,不拿,往右走。到终点之后要判断是否拿到 kkk 件物品,或者在马上到终点时(即 [i−1][i-1][i1] [j][j][j][i][i][i] [j−1][j-1][j1])是否拿到 k−1k-1k1 件物品。

要加记忆化,降低时间复杂度,应该可以拿满

因为可能会有重复,会浪费很多时间,我们用一个 MarkMarkMark 数组来储存已计算过的路径,降低复杂度,避免不必要的重复。即 if(mark[x][y][maxk+1][k]!=−1)returnif(mark[x][y][maxk+1][k]!=-1) returnif(mark[x][y][maxk+1][k]!=1)return mark[x][y][maxk+1][k];mark[x][y][maxk+1][k];mark[x][y][maxk+1][k];

DPDPDP

动态规划可能会比较难理解

dpdpdp 数组存当前位置拿的宝物的数量,最后输出就行了。

下面附上 DFSDFSDFS 代码

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int mark[55][55][14][14],a[55][55],n,m,k;
int dfs(int x, int y, int maxk, int k){
	if(x==n+1||y==m+1) return 0;
	if(mark[x][y][maxk+1][k]!=-1) return mark[x][y][maxk+1][k];
	long long cnt=0;
	if(x==n&&y==m) if(k==k||k==k-1&&a[x][y]>maxk){ cnt++;
	else{
		cnt+=dfs(x,y+1,maxk,k);
		if(a[x][y]>maxk) cnt+=dfs(x,y+1,a[x][y],k+1);
		cnt+=dfs(x+1,y,maxk,k);
		if(a[x][y]>maxk) cnt+=dfs(x+1,y,a[x][y],k+1);
	}
	mark[x][y][maxk+1][k]=cnt%mod;//注意一定要摸
	returnmark[x][y][maxk+1][k];
}
int main() {
	cin>>n>>m>>k;
	for(inti=1;i<=n;i++) for(intj=1;j<=m;j++) cin>>a[i][j];
	memset(mark,-1,sizeof(mark));
	cout<<dfs(1,1,-1,0);
	return 0;
}

这是本蒟蒻写的第一篇题解,管理员大大一定要过!!!

谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值