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

地宫取宝dfs

在这里插入图片描述

分析:

矩阵里的每一个位置都有标记,要求的问题是:有几种方法能完成这个规定。
那么,我们只需要计算从开始(1,1)到最后(n,m)的深度优先搜索中,有几个是满足要求的即为正确答案。
有个要求是,如果一个格子中的价值比已经拿的都大,那么可以选择拿或者不拿,这里就有两种情况,一个是以手中的最大值mx做标准,另一种是以c[i][j]做标准,两种情况。

代码示例:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 55,p=1e9+7;
int n,m,k,c[N][N]; 
int dx[]={0,1};
int dy[]={1,0};
int dp[N][N][15][15];
bool inmp(int x,int y){return (x>=1&&x<=n&&y>=1&&y<=m);
}
ll dfs(int x,int y,int mx,int cnt){if(x==n&&y==m)return cnt==k;if(dp[x][y][mx][cnt]!=-1)return dp[x][y][mx][cnt];ll res=0;for(int i=0;i<2;i++){int nx=x+dx[i];int ny=y+dy[i];if(!inmp(nx,ny))continue;// 拿这个 if(c[nx][ny]>mx&&cnt<k)res=(res+dfs(nx,ny,c[nx][ny],cnt+1))%p;// 不拿这个res=(res+dfs(nx,ny,mx,cnt))%p;}return dp[x][y][mx][cnt]=res;
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);memset(dp,-1,sizeof(dp));cin>>n>>m>>k;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>c[i][j];c[i][j]++;}cout<<(dfs(1,1,0,0)+dfs(1,1,c[1][1],1))%p;return 0;
}
/*可以设置状态dp[x][y][mx][cnt]表示走到(x,y),手中有cnt个宝贝且最大值为mx的方案数 */
http://www.lryc.cn/news/324367.html

相关文章:

  • Ollama 运行 Cohere 的 command-r 模型
  • 2024年C语言最新经典面试题汇总(11-20)
  • arm linux应用程序crash分析一般方法
  • Web安全防护技术解决方案
  • 流畅的 Python 第二版(GPT 重译)(十一)
  • Blender 3D建模要点
  • 网络安全实训Day8
  • GB28181 —— 5、C++编写GB28181设备端,完成将USB摄像头视频实时转发至GB28181服务并可播放(附源码)
  • Git工具的详细使用
  • 【prometheus-operator】k8s监控redis
  • 外包干了4年,技术退步明显.......
  • xbackup 备份MySQL数据库脚本
  • npm常用命令详解
  • IPV6协议之RIPNG
  • JVM垃圾收集器你会选择吗?
  • 游戏防沉迷系统相关内容
  • 每日OJ题_牛客_JD1 年终奖(动态规划)
  • 深度学习 tablent表格识别实践记录
  • 深度学习 线性神经网络(线性回归 从零开始实现)
  • HBase在表操作--显示中文
  • 基于BusyBox的imx6ull移植sqlite3到ARM板子上
  • 连续子数组的最大和
  • Photoshop 工具使用详解(全集 · 2024版)
  • C++函数返回机制,返回类型
  • [linux] Key is stored in legacy trusted.gpg keyring
  • 阿里云部署OneApi
  • MapReduce学习问题记录
  • Elasticsearch优化
  • 【Redis知识点总结】(六)——主从同步、哨兵模式、集群
  • Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁