当前位置: 首页 > article >正文

地宫取宝---dfs‘记忆

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
int n,m,k;
int vis[52][52];
int dx[2]={0,1};
int dy[2]={1,0};
ll dp[52][52][15][15];///dfs几个变量就几维数组,
///n,m,k,ci的值都较小,所以用dfs
///大了用动归,bfs等 
ll dfs(int x,int y,int c,int ma)
{
	if(x==n&&y==m&&c==k)///满足条件 
	{
	return 1;	
	}
	if(c>k) return 0;								   ///记忆化的优势--剪枝 
	if(dp[x][y][c][ma+1]!=-1) return dp[x][y][c][ma+1];///加1是为了初始值为-1,
													   ///因为有价值为0的		 
	int w=0,e=0;
	for(int i=0;i<2;i++)
	{
		int tx=x+dx[i];
		int ty=y+dy[i];
		if(tx>=1&&tx<=n&&ty>=1&&ty<=m)
		{
			if(vis[tx][ty]>ma)
			{
				if(!i) w=(dfs(tx,ty,c+1,vis[tx][ty])+dfs(tx,ty,c,ma))%1000000007;
				else e=(dfs(tx,ty,c+1,vis[tx][ty])+dfs(tx,ty,c,ma))%1000000007;
			}
			else 
			{
				if(!i)
				w=dfs(tx,ty,c,ma)%1000000007;
				else e=dfs(tx,ty,c,ma)%1000000007;
			}
		}
	}
	dp[x][y][c][ma+1]=(w+e)%1000000007; 
	return dp[x][y][c][ma+1];
}
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=m;j++)
    	{
    		cin>>vis[i][j];
		}
	}
	ll s=0;
	memset(dp,-1,sizeof(dp));
	dfs(1,1,0,-1);
	s+=dp[1][1][0][0]%1000000007; ///第一个没拿 
	memset(dp,-1,sizeof(dp));
	dfs(1,1,1,vis[1][1]); 
	s+=dp[1][1][1][vis[1][1]+1]%1000000007;///第一个拿了
	cout<<s%1000000007;
    return 0;
}


http://www.kler.cn/a/591317.html

相关文章:

  • Python核心:Django鉴权方案全解析
  • Android第四次面试总结(基础算法篇)
  • SpringCloud 学习笔记2(Nacos)
  • 实验9-2 高级搜索技术2
  • browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案
  • 苹果宣布iOS 19将支持RCS 3.0,短信功能迎来大升级
  • 微信小程序:修改提示信息placeholder颜色
  • 【亲测有效,已顺利上线】你好,你的小程序涉及提供播放、观看等服务,请补充选择:文娱-其他视频类目。(多种没有资质的解决方案)
  • 自动驾驶背后的数学:特征提取中的线性变换与非线性激活
  • vue3 函数式弹窗
  • NGINX 执行阶段与OpenResty的 *_by_lua指令
  • DevOps工具链
  • VulnHub-Joker通关攻略
  • 微信小程序实现根据不同的用户角色显示不同的tabbar并且可以完整的切换tabbar
  • 【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现生物识别(指纹识别)应用
  • Arch Linux高性能数据处理优化指南
  • C++ 学习笔记(三)—— 入门+类和对象
  • 【PDF识别】总结PDF文本内容与表格提取的方法
  • 招聘信息|基于SprinBoot+vue的招聘信息管理系统(源码+数据库+文档)
  • 如何才能避免漏测事故的发生?