2014蓝桥杯:地宫取宝(DFS详解)
八、题目;地宫取宝
问题描述
X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
输入格式
输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
输出格式
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
样例输入
2 2 2
1 2
2 1
样例输出
2
样例输入
2 3 2
1 2 3
2 1 5
样例输出
14
1.分析思路:
有三个条件:
- 入口在左上角,出口在右下角,只能向下或者向右走一个
- 格子中的宝贝价值比手中任意宝贝价值都大,小明可以拿起它,也可以不拿
- 走到出口时,手中的宝贝恰好是k件
刚开始使用深度搜索发现,方案数会变得很复杂
题目的意思很简单,就是用深搜的方式来找出到底有多少路径,但是开始的时候虽然一眼就认定了是深度搜索,但是还真的不知道怎么搜,因为碰到不能捡的物品就不知道该怎么处理了,每一个路口会遇到四种不同的方案,这样下来整道题就组合数方案就很复杂。
后来发现用记忆递归结合深搜可以试一下
2.代码:
#include<iostream>
#include<cstring>
using namespace std;const int MOD=1000000007;
int n,m,k;
int data[50][50];long long ans;
long long cache[50][50][14][13];//cache数组中记录的是状态 x、y坐标 拥有宝物数量 拥有宝物的最大值 //如cache[3][4][5][6]=7 即当在map[3][4]且身上有5件宝物 宝物的最大值是6 是到达终点有7中路径//可以将入口定义为坐标(0,0)
void dfs(int x,int y,int max,int cnt){}
long long dfs2(int x,int y,int max,int cnt){ //当前位置 拥有宝物的数量 拥有的宝物的最大值//查缓存 if(cache[x][y][max+1][cnt!=-1]) //判断这个状态是否已经走过,如果走过就直接用记录的数值计算//因为宝物有可能为0所以定义max时用最小值-1 这就导致无法作为下标使用 实际上如果测试数据中宝物价值没有0//将所有的+1 去掉也是可以的 这里的话如果去掉肯定是有些数据不对的return cache[x][y][max+1][cnt];long long ans=0;if(x==n||y==m||cnt>k) //向右走到n或者向下走到m或者宝物数量达到最大,满足其中一个即可 return 0;int cur=data[x][y]; //当前坐标位置 if(x==n-1&&y==m-1) //已经面临最后一个格子{if(cnt==k||(cnt==k-1&&cur>max)){ans++;if(ans>MOD)ans%=MOD;}return ans;} if(cur>max){ //可以取这个物品 ans+=dfs2(x,y+1,max,cnt); //向左走 ans+=dfs2(x+1,y,max,cnt); //向右走 } //对于价值较小,或者价值大,可以不去取这个物品的情况ans+=dfs2(x,y+1,max,cnt);ans+=dfs2(x+1,y,max,cnt); cache[x][y][max+1][cnt]=ans%MOD;return ans%MOD;}int main(){scanf("%d %d %d",&n,&m,&k);for(int i=0;i<n;i++){for(int j=0;j<n;j++){scanf("%d",&data[i][j]);}}dfs(0,0,-1,0); //第一个点的价值可能为0memset(cache,-1,sizeof(cache));printf("%lli\n",dfs2(0,0,-1,0));return 0; }
2014蓝桥杯:地宫取宝(DFS详解)相关推荐
- 蓝桥杯.地宫取宝(记忆化搜索)
Question: Solve: a.第一眼审题看到从左上角走到右下角,dfs b.再继续看题目,有限定条件: 1.走到一个位置依据已拿宝物的最大价值 maxn 选择是否拿宝 2.只有走到右下角且拿宝 ...
- 蓝桥杯 地宫取宝【第五届】【省赛】【C组】C++ dfs 记忆化搜索
资源限制 时间限制:1.0s 内存限制:256.0MB X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...
- 第五届蓝桥杯--地宫取宝
dp代码 #include <iostream> #include <algorithm> #include <cstring> #define P 1000000 ...
- Java算法学习:蓝桥杯——地宫寻宝(DFS+动态规划—记忆型递归)
Java算法学习:蓝桥杯--地宫寻宝(DFS✖记忆型递归) 题目: 标题:地宫取宝X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出 ...
- 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)
蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...
- 2014年第五届蓝桥杯省赛试题及详解(Java本科A组)
蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分2分) 结果填空 (满分6分) 结果填空 (满分7分) 代码填空 (满分4分) 代码填空 (满分12分) 结果填空 (满分12分) 结果填空 (满分 ...
- 2013年第四届蓝桥杯国赛试题及详解(Java本科B组)
蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分10分) 结果填空 (满分12分) 代码填空 (满分8分) 程序设计(满分17分) 程序设计(满分22分) 程序设计(满分31分) 1.标题:猜灯谜 ...
- 蓝桥杯-K好数(详解易懂)java
蓝桥杯-K好数java 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数 ...
- 【蓝桥杯JavaB组真题详解】武功秘籍(2014)
题目描述 武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的). 他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上. 小明只想练习该书的第 ...
最新文章
- OkHttp3源码详解(三) 拦截器-RetryAndFollowUpInterceptor
- ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法
- 每日一皮:程序员的生存状态 ...
- python爬虫beautifulsoup实例-Python爬虫学习(二)使用Beautiful Soup库
- Chrome报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
- lstm不收敛_20道深度学习面试题,有你不知道的吗?
- C/C++头文件一览
- 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看
- 第八周项目4-个人所得税计算器
- 【机器视觉】线阵相机模型说明以及使用HALCON标定助手对线阵相机进行标定
- 游戏感:虚拟感觉的游戏设计师指南——第七章 响应的测量方法
- 通往财富自由之路20160808--付费就是捡便宜
- 5.图像,音视频标签
- elasticsearch nested嵌套查询
- c语言程序与化学有关的程序,化工热力学C语言程序.doc
- Hackthebox练习kaliLinux学习
- [业界新闻] 网络多媒体老大Macromedia被Adobe收购!
- googiehost免费空间申请
- 如何在Word中输入英语音标
- java 如何判断对象内的某个属性是空
热门文章
- python教程我要自学网-我要自学网--json 数据解析-python。
- python和c语言的区别-python和c语言的区别是什么
- python和c先学哪个-python和c先学哪个
- python decorator. decorator_decorator在Python中的作用
- idea中怎么新建vue项目_项目中使用vue-awesome-swiper
- 日志分析里面的max是什么_mysql慢日志文件分析处理
- vue中文件上传方法
- LeetCode 674 最长连续递增子序列
- LIRe 源代码分析 1:整体结构
- 存储如何做远程服务器数据备份_如何选择存储用的服务器?