标题:地宫取宝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资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

思路:DFS,就是一道搜索的题,注意简化数据,就是背包中宝物最大价值 ,一个就是宝物数量。

#include<iostream>
#include<algorithm>
using namespace std;
int a[50][50];
int n,m,k;
long long ans=0;
void dfs(int i,int j,int max,int cnt){int lmax=a[i][j];//lmax是输入进去的每个格子的宝物价值if(i==n||j==m){//这里防御一下,越界了就return return ;}if(i==n-1&&j==m-1&&(cnt==k||(lmax>max&&cnt==k-1))){//满足条件的点我们把ans++//这里特别注意的就是,有可能到了最后一个格子,当前格子的宝物可以拿//但此时cnt差一个才到k,就有可能继续走了,导致没记录成功,所以边界要注意一下ans++;return ;}if(a[i][j]>max){//拿宝物的走法dfs(i+1,j,lmax,cnt+1);dfs(i,j+1,lmax,cnt+1);}dfs(i+1,j,max,cnt);//不拿宝物的走法dfs(i,j+1,max,cnt);}int main(){cin>>n>>m>>k;for(int i=0;i<n;i++){//读入数据for(int j=0;j<m;j++){cin>>a[i][j];}}dfs(0,0,-1,0); //调用dfs时要注意,因为数据规模中,宝物价值可能等于0,所以第一个宝物价值可 //能等于0的,所以max要传入-1;cout<<ans%1000000007;//最后按要求输出return 0;
}

这种写法数据大可能会超时,改成记忆型递归比较好,就不用每次都跑到底了,可能从别的路径过来的时候如果缓存里有就直接用了,比较一下两种代码,理解一下记忆型递归,代码如下

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,k;
int a[50][50];
long long co[50][50][13][13];//开一个表示状态的四维数组
//改成记忆型递归,不用全局变量ans了,void改成long long型 用 return写,其实改动不多
long long dfs(int i,int j,int max,int cnt){if(co[i][j][max+1][cnt]!=-1) return co[i][j][max+1][cnt];//查缓存,如果有的话,就直接用//一个节点如果把所有到终点的路径都走完了,就保存,那么从另一种路径到这个节点的时候,就不需 //要再走到终点了,直接return 存下来的值就好了,省去了很多时间 long long ans=0;//函数内部开辟一个 ansif(i==n||j==m){//边界不变,越界返回0,不计数return 0;}if((i==n-1&&j==n-1&&cnt==k)||(i==n-1&&j==n-1&&cnt==k-1&&a[i][j]>max)){//条件不变,满足条件的return 1,算一种return 1;   }if(a[i][j]>max){ans+=dfs(i+1,j,a[i][j],cnt+1);//这里改成ans+=,这样去递归,实际上把当前节点满足条件//的路径全部记录下来了,四种方式ans+=dfs(i,j+1,a[i][j],cnt+1);}ans+=dfs(i+1,j,max,cnt);ans+=dfs(i,j+1,max,cnt);co[i][j][max+1][cnt]=ans;//全跑完以后,此时的ans就是当前节点所有满足条件的寻宝方式//把当前节点的ans存入状态中,因为max传进来是-1,所以这里改//成max+1,防止数组越界,这样下次以别的寻宝方式走到当前节点                                                                //时,就可以直接返回数组中的值,就不用再做一次搜索了;        return ans%1000000007;//每个节点 按要求返回这个ans%1000000007,这个不用担心,递归过            //程中实际上是不影响最终值的,打个比方 return 3回去和return         //1000000010回去是一种,最后一步回去%1000000007的值都是 3
}int main(){cin>>n>>m>>k;memset(co,-1,sizeof(co));//把缓存全部制成-1for(int i=0;i<n;i++){for(int j=0;j<m;j++)cin>>a[i][j];}    cout<<dfs(0,0,-1,0);return 0;
} 

蓝桥杯c/c++真题 地宫寻宝相关推荐

  1. 小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题

    文章目录 前言 一.啤酒和饮料 二.切面条 三.李白打酒 四.史丰收速算 五.打印图形 六.奇怪的分式 七.六角填数 八.蚂蚁感冒 九.地宫取宝 十.小朋友排队 上一篇: 小唐开始刷蓝桥(六)2015 ...

  2. 2014年第五届C/C++ B组蓝桥杯省赛真题

    2013年第四届C/C++ B组蓝桥杯省赛真题 真题 第一题:啤酒和饮料 第二题:切面条 第三题:李白打酒 第四题:史丰收速算 第五题:打印图形 第六题:奇怪的分式 第七题:六角填数 第八题:蚂蚁感冒 ...

  3. 蓝桥杯Java历年真题与答案_蓝桥杯大赛java历年真题及答案整理(闭关一个月呕心沥血整理出来的)...

    蓝桥杯大赛java历年真题及答案整理(闭关一个月呕心沥血整理出来的) 1蓝桥杯 java 历年真题及答案整理(闭关一个月,呕心沥血整理出来的)1. 算法是这样的,如果给定 N 个不同字符,将这 N 个 ...

  4. 3位水仙花数计算pythonoj_Python解答蓝桥杯省赛真题之从入门到真题

    若发现此文章消失,则是在等待审核中,稍等一会儿即可显示,谢谢. 另外,我会尽量晚上上传更新题目. 此文章太长了,导致MD编辑器很卡,另写了一篇接续 传送门 Python解答蓝桥杯省赛真题之从入门到真题 ...

  5. 第八届蓝桥杯全国总决赛真题解析

    36进制 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 对于 16 进制,我们使用字母 A−F 来表示 10 及以上的数字. 如法炮制,一直用到字母 Z,就可以表示 36 ...

  6. 植树节种树-第12届蓝桥杯Scratch选拔赛真题精选

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第87讲. 蓝桥杯选拔赛每一届都要举行4~5次,和省赛.国赛相比,题目要简单不少,再加上篇幅 ...

  7. 闰年计算-第13届蓝桥杯Scratch选拔赛真题精选

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第76讲. 蓝桥杯选拔赛每一届都要举行4~5次,和省赛.国赛相比,题目要简单不少,再加上篇幅 ...

  8. 红绿灯记忆游戏-第13届蓝桥杯Scratch选拔赛真题精选

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第77讲. 蓝桥杯选拔赛每一届都要举行4~5次,和省赛.国赛相比,题目要简单不少,再加上篇幅 ...

  9. 第十三届蓝桥杯国赛真题 PythonB组 复盘以及获奖感言(国一!!!)

    第十三届蓝桥杯国赛真题 PythonB组 复盘以及获奖感言(国一) 文章目录 第十三届蓝桥杯国赛真题 PythonB组 复盘以及获奖感言(国一)

最新文章

  1. VTK嵌入MFC同步显示
  2. 移动办公系统 服务器地址,安卓系统移动办公服务器地址
  3. [C指针] 用图表解读C声明:Unscrambling C Declarations by Diagram
  4. 用户与计算机系统的交互换界面,人机交互期末PPT复习(GXNU李智老师)
  5. 村长叫你领书过年,送3本Python好书
  6. 中国荔枝市场趋势报告、技术动态创新及市场预测
  7. python3实现json转excel
  8. 期货交易中的一些术语
  9. 动态IP和静态IP的区别如何使用动态IP
  10. BUCK电路分析(一)
  11. 【git】cherry-pick详解
  12. 进下流行移动开发框架对比
  13. 江民KV2007离线包和安装包下载
  14. 云虚拟主机☀️利用FileZilla,使用FTP协议给阿里云虚拟主机上传、下载文件
  15. opensips3.0之新工具opensips-cli
  16. 小黑为四川大学实习金融专业同学解决了困扰好久的一个代码小bug,获得成就感,和清华实习同学约饭啦(被请客),继续向前的leetcode之旅:145. 二叉树的后序遍历
  17. struct2破绽及升级
  18. 2022年湖南省高职单招(面试)考试强化训练及答案
  19. GIF制作器哪个好,如何制作表情包
  20. 量化交易 米筐 单因子回测框架(因子方向性确定)

热门文章

  1. 交换机配置VLANIF
  2. 2017计算机专业在职研究生,2017年计算机在职研究生考试科目
  3. C#中实现回车就切换控件的功能居然是它,真的让人好懵圈
  4. 信息系统项目管理师——十大管理之间的关系
  5. setTimeout()与setInterval()区别
  6. Odoo启动过程详解
  7. 极米坚果等家用DLP投影仪维修指南
  8. 基于SSM的校园二手书管理系统 基于java的二手平台代码 二手商城系统下载
  9. SM2算法对比RSA算法,有哪些优势?
  10. python列表元素求和_如何在python语言使用不同方法实现列表元素求和