蓝桥杯 地宫取宝【第五届】【省赛】【C组】C++ dfs 记忆化搜索
资源限制
时间限制: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 记忆化搜索相关推荐
- 蓝桥杯.地宫取宝(记忆化搜索)
Question: Solve: a.第一眼审题看到从左上角走到右下角,dfs b.再继续看题目,有限定条件: 1.走到一个位置依据已拿宝物的最大价值 maxn 选择是否拿宝 2.只有走到右下角且拿宝 ...
- 2014蓝桥杯:地宫取宝(DFS详解)
八.题目;地宫取宝 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能 ...
- [蓝桥杯][2016年第七届真题]密码脱落(记忆化搜索)
题目描述 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其 ...
- 第五届蓝桥杯--地宫取宝
dp代码 #include <iostream> #include <algorithm> #include <cstring> #define P 1000000 ...
- dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割
记忆化递归的必要性: 普通的递归可能会重复求解某一值,类似斐波那契数列.同样的子问题可能会被求解多次,这样就会很慢很慢很慢 解决方法:我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接 ...
- 地宫取宝----第五届蓝桥杯
/** 标题:地宫取宝X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出口在右下角.小明被带到地宫的入口,国王要求他只能向右或向下行 ...
- 牛客假日团队赛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 ...
- 2019第十届蓝桥杯大赛青少年创意编程省赛C++组试题解析
水平有限,如有不当请不吝赐教,万分感谢 水下探测器 水下探测器可以潜入湖中在任意水深进行科学探索. 湖水的最大深度为 h 米,即它在湖底时到水面的距离,0<=h<=100: 探测器最初的水 ...
- 蓝桥杯 ALGO-1005 数字游戏 DFS记忆化搜索+剪枝+杨辉三角 python
题目 问题描述 给定一个1-N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字. 例如: 3 1 2 4 4 3 ...
最新文章
- 零编程基础学python-如果是一个纯0编程基础的小白,如何学Python
- rest-framework 版本控制
- 010_html事件属性
- edtext 从右边开始输入 安卓_Android开发之EditText属性详解
- 5g时代新型基础设施建设白皮书 下载_全文下载 | 5G时代新型基础设施建设白皮书...
- Teambition CEO齐俊元:大象起舞,现代组织的企业协作
- check上传模板中的金额字段中的千分位
- 小妲己智能机器人要连接wifi吗_“能扫能拖,聪明能干”,360扫地机器人S7一周体验分享...
- java 正则首位8或者9的8位数字_Python 正则表达式re最完整的操作教程
- 从定义到AST及其遍历方式,一文带你搞懂Antlr4
- 利用console控制台调试php代码
- jquery.chosen.js实现模糊搜索
- C++程序设计随笔(二)
- 小米台灯突然自己亮了_米家台灯Pro,工作读书随我选
- Poker2 简单配置(方便于vim党)
- php编写出一个时钟,用HTML5实现一个时钟
- 领域自适应论文(六十八):Implicit Class-Conditioned Domain Alignment for Unsupervised Domain Adaptation论文原理
- Interview100-91 著名的毒酒问题
- mpvue的一些知识
- Java 定义一个描述圆的类,然后生成一个圆对象,最后输出半径、直径和面积