资源限制

时间限制:1.0s   内存限制:256.0MB

  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

  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

  注意: main函数需要返回0
  注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
  注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

  提交时,注意选择所期望的编译器类型。

思路

如果简单的dfs,那么是必定会TLE的。所以此处采取记忆化搜索的方式记录搜索过的状态,再次搜索到已经搜索过的状态时,直接返回其方法数即可。

Code

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int n, m, k;
long long cnt;
int a[55][55];
int wk[2][2] = { {1,0},{0,1} };//向下走和向右走
int dp[55][55][15][15];//dp[i][j][tk][tmax]表示坐标为i,j,已经选取了tk个宝物,最大值为tmax状态下的选法
int dfs(int x, int y, int tk,int tmax) {int t = 0;//tmax+1是因为tmax初始化为-1。若不如此,则初始位置权值为0的则变成不可选,且防止下标为-1//所以所有的值都对应+1if (dp[x][y][tk][tmax+1] != -1)return dp[x][y][tk][tmax+1];//此状态已经搜索过,直接返回if (x == n-1 && y == m-1) {//到达终点if (a[x][y] > tmax) {//若终点值大于暂时的最大值if (tk == k || tk == k - 1)t++;//那么终点宝物可选可不选 tk==k-1||tk==k都可}else if (tk == k)//若小于那么只能不选t++;return dp[x][y][tk][tmax + 1] = t;}for (int i = 0; i < 2; i++) {//搜索下方和右方int tx = x + wk[i][0], ty = y + wk[i][1];if ( tx>n  || ty>m)continue;//如果右方或者下方越界则不必再搜索if (a[x][y]>tmax)//如果a[x][y]比现有的都大{//拿下a[x][y]t+=dfs(tx, ty, tk + 1,a[x][y]);//继续搜索t %= mod;}t+=dfs(tx, ty, tk,tmax);//不拿t %= mod;}return dp[x][y][tk][tmax + 1] = t;//返回值}
int main(){scanf("%d%d%d", &n, &m, &k);for (int i = 0; i < n; i++) for (int j  =0; j < m; j++) scanf("%d", a[i] + j);memset(dp, -1, sizeof(dp));//初始化cout << dfs(0,0,0,-1);//初始在0,0位置,选了0个,最大值设置成-1return 0;}

蓝桥杯 地宫取宝【第五届】【省赛】【C组】C++ dfs 记忆化搜索相关推荐

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

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

  2. 2014蓝桥杯:地宫取宝(DFS详解)

    八.题目;地宫取宝 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能 ...

  3. [蓝桥杯][2016年第七届真题]密码脱落(记忆化搜索)

    题目描述 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其 ...

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

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

  5. dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割

    记忆化递归的必要性: 普通的递归可能会重复求解某一值,类似斐波那契数列.同样的子问题可能会被求解多次,这样就会很慢很慢很慢 解决方法:我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接 ...

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

    /** 标题:地宫取宝X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出口在右下角.小明被带到地宫的入口,国王要求他只能向右或向下行 ...

  7. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  8. 2019第十届蓝桥杯大赛青少年创意编程省赛C++组试题解析

    水平有限,如有不当请不吝赐教,万分感谢 水下探测器 水下探测器可以潜入湖中在任意水深进行科学探索. 湖水的最大深度为 h 米,即它在湖底时到水面的距离,0<=h<=100: 探测器最初的水 ...

  9. 蓝桥杯 ALGO-1005 数字游戏 DFS记忆化搜索+剪枝+杨辉三角 python

    题目 问题描述 给定一个1-N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字. 例如: 3 1 2 4 4 3 ...

最新文章

  1. 零编程基础学python-如果是一个纯0编程基础的小白,如何学Python
  2. rest-framework 版本控制
  3. 010_html事件属性
  4. edtext 从右边开始输入 安卓_Android开发之EditText属性详解
  5. 5g时代新型基础设施建设白皮书 下载_全文下载 | 5G时代新型基础设施建设白皮书...
  6. Teambition CEO齐俊元:大象起舞,现代组织的企业协作
  7. check上传模板中的金额字段中的千分位
  8. 小妲己智能机器人要连接wifi吗_“能扫能拖,聪明能干”,360扫地机器人S7一周体验分享...
  9. java 正则首位8或者9的8位数字_Python 正则表达式re最完整的操作教程
  10. 从定义到AST及其遍历方式,一文带你搞懂Antlr4
  11. 利用console控制台调试php代码
  12. jquery.chosen.js实现模糊搜索
  13. C++程序设计随笔(二)
  14. 小米台灯突然自己亮了_米家台灯Pro,工作读书随我选
  15. Poker2  简单配置(方便于vim党)
  16. php编写出一个时钟,用HTML5实现一个时钟
  17. 领域自适应论文(六十八):Implicit Class-Conditioned Domain Alignment for Unsupervised Domain Adaptation论文原理
  18. Interview100-91 著名的毒酒问题
  19. mpvue的一些知识
  20. Java 定义一个描述圆的类,然后生成一个圆对象,最后输出半径、直径和面积

热门文章

  1. nexus 6p刷入kali移动渗透测试平台
  2. shell运用——冒泡排序
  3. 用Eclipse3.1+WTP0.7配置web开发平台
  4. 测试工程师真的35岁就干不动了吗?
  5. 京东新通路2020年将新增1万家“六统一”门店
  6. win10的.sql文件怎么取消默认sql server打开方式
  7. Duilib学习-Duilib窗口居中
  8. KVM虚拟化平台搭建!!!
  9. “史上最强春节档”来袭!数据告诉你这几部影片最值得看
  10. portainer的使用