八、题目;地宫取宝
问题描述
  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详解)相关推荐

  1. 蓝桥杯.地宫取宝(记忆化搜索)

    Question: Solve: a.第一眼审题看到从左上角走到右下角,dfs b.再继续看题目,有限定条件: 1.走到一个位置依据已拿宝物的最大价值 maxn 选择是否拿宝 2.只有走到右下角且拿宝 ...

  2. 蓝桥杯 地宫取宝【第五届】【省赛】【C组】C++ dfs 记忆化搜索

    资源限制 时间限制:1.0s   内存限制:256.0MB X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  3. 第五届蓝桥杯--地宫取宝

    dp代码 #include <iostream> #include <algorithm> #include <cstring> #define P 1000000 ...

  4. Java算法学习:蓝桥杯——地宫寻宝(DFS+动态规划—记忆型递归)

    Java算法学习:蓝桥杯--地宫寻宝(DFS✖记忆型递归) 题目: 标题:地宫取宝X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出 ...

  5. 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...

  6. 2014年第五届蓝桥杯省赛试题及详解(Java本科A组)

    蓝桥杯历年真题题目及题解目录汇总  结果填空 (满分2分) 结果填空 (满分6分) 结果填空 (满分7分) 代码填空 (满分4分) 代码填空 (满分12分) 结果填空 (满分12分) 结果填空 (满分 ...

  7. 2013年第四届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分10分) 结果填空 (满分12分) 代码填空 (满分8分) 程序设计(满分17分) 程序设计(满分22分) 程序设计(满分31分) 1.标题:猜灯谜 ...

  8. 蓝桥杯-K好数(详解易懂)java

    蓝桥杯-K好数java 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数 ...

  9. 【蓝桥杯JavaB组真题详解】武功秘籍(2014)

    题目描述 武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的). 他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上. 小明只想练习该书的第 ...

最新文章

  1. OkHttp3源码详解(三) 拦截器-RetryAndFollowUpInterceptor
  2. ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法
  3. 每日一皮:程序员的生存状态 ...
  4. python爬虫beautifulsoup实例-Python爬虫学习(二)使用Beautiful Soup库
  5. Chrome报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
  6. lstm不收敛_20道深度学习面试题,有你不知道的吗?
  7. C/C++头文件一览
  8. 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看
  9. 第八周项目4-个人所得税计算器
  10. 【机器视觉】线阵相机模型说明以及使用HALCON标定助手对线阵相机进行标定
  11. 游戏感:虚拟感觉的游戏设计师指南——第七章 响应的测量方法
  12. 通往财富自由之路20160808--付费就是捡便宜
  13. 5.图像,音视频标签
  14. elasticsearch nested嵌套查询
  15. c语言程序与化学有关的程序,化工热力学C语言程序.doc
  16. Hackthebox练习kaliLinux学习
  17. [业界新闻] 网络多媒体老大Macromedia被Adobe收购!
  18. googiehost免费空间申请
  19. 如何在Word中输入英语音标
  20. java 如何判断对象内的某个属性是空

热门文章

  1. python教程我要自学网-我要自学网--json 数据解析-python。
  2. python和c语言的区别-python和c语言的区别是什么
  3. python和c先学哪个-python和c先学哪个
  4. python decorator. decorator_decorator在Python中的作用
  5. idea中怎么新建vue项目_项目中使用vue-awesome-swiper
  6. 日志分析里面的max是什么_mysql慢日志文件分析处理
  7. vue中文件上传方法
  8. LeetCode 674 最长连续递增子序列
  9. LIRe 源代码分析 1:整体结构
  10. 存储如何做远程服务器数据备份_如何选择存储用的服务器?