Question:

Solve:

a.第一眼审题看到从左上角走到右下角,dfs

b.再继续看题目,有限定条件:

1.走到一个位置依据已拿宝物的最大价值 maxn 选择是否拿宝

2.只有走到右下角且拿宝数 cnt = k 的路径才有效

c.所以第一步先把左上到右下的深搜写出来

因为待会涉及到一个宝物最大价值 maxn 和拿宝数 cnt 的问题,所以dfs传入四个参数

d. 但是光这样的条件深搜是得不到满分的,所以还得优化

通过对路径位置之间的关系分析我们可以知道:

在四个参数不变的前提之下,这个状态的dfs还是会被计算多次

最简单的情况:

从不同方向到达(x, y)点,如果之前的拿宝数都是cnt - 1,而且 maxn 都要小于 (x, y) 位置的宝物价值a[x][y],那就会重复计算(x, y, a[x][y], cnt)。更别说有可能在几步之前取宝数达到cnt-1,然后后面几步不拿宝,到 (x, y) 再拿宝到达 cnt 这个数值

e.因此这道题的重复计算是非常恐怖的,我们可以考虑用一个四维数组将已经计算出来的值存下来

这样就可以在到达一个搜索状态的时候,先去判断这个状态是否已经计算,如果计算过就直接返回之前的结果

至于为什么是四维数组,这是因为dfs的参数有四个,四维分别对应 dfs 的四个参数

注意点:因为宝物价值是有可能为 0 的,所以 maxn 的初值设定成了 -1 ,但数组是没有负下标的,因此在记忆的时候选择将 maxn 的下标 +1,通过偏移量来解决数组越界问题

具体的实现看代码吧~

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
//基本变量
int n, m, k;
//记忆数组,输入数组
ll vis[51][51][15][13], a[55][55];
//记忆化搜索
ll dfs(int x, int y, int maxn, int cnt)
{ll res = 0; //到达边界或者取宝数大于kif(x > n || y > m || cnt > k) return 0;//已经计算过,直接返回if(vis[x][y][maxn+1][cnt] != -1) return vis[x][y][maxn+1][cnt];//边界出口if(x == n && y == m){if(cnt == k || (cnt == k-1 && a[n][m] > maxn)) return 1;return 0;}//拿或不拿分别两种走法if(a[x][y] > maxn){res += dfs(x+1, y, a[x][y], cnt+1);res += dfs(x, y+1, a[x][y], cnt+1);}res += dfs(x+1, y, maxn, cnt);res += dfs(x, y+1, maxn, cnt);//结果记忆并返回return vis[x][y][maxn+1][cnt] = res % mod;
}
int main(void)
{memset(vis, -1, sizeof(vis));scanf("%d%d%d", &n, &m, &k);for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++)scanf("%d", &a[i][j]);}cout <<dfs(1, 1, -1, 0);return 0;
}

最后附上蓝桥杯汇总链接:蓝桥杯C/C++A组省赛历年真题题解

声明:图片均来源于蓝桥杯官网,以个人刷题整理为目的,如若侵权,请联系删除~

蓝桥杯.地宫取宝(记忆化搜索)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【蓝桥杯真题】地宫取宝(搜索-记忆化搜索详解)

    链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  7. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

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

  8. 【蓝桥杯】历届试题 地宫取宝(记忆化搜索、dfs、dp)

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

  9. [蓝桥杯][2014年第五届真题]地宫取宝(记忆化搜索)

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

最新文章

  1. 定义一个DOG类(Java)
  2. js获取网页的各种高度
  3. 每天学一点儿shell:Linux中crontab的用法
  4. C语言打印字符串的所有排列组合(附完整源码)
  5. python模拟购物模块_python -模拟购物 -赊账版 粗糙之极
  6. 分享一个在线vim网站
  7. 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义、指数和对数映射
  8. CCF201512-4 送货(100分)
  9. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中
  10. Sass:基础用法学习笔记
  11. 信息安全原理复习资料
  12. Matlab文件IO操作函数,fgetl和textscan介绍以及使用时可能遇到的问题
  13. 如何用C语言将华氏温度转化为摄氏温度
  14. html飞机翼布局,基础知识 | 飞机客舱布局及主要设施介绍
  15. elementUI时间日期组件设置的默认时间在ie中无法重置
  16. ijkplayer源码---FFPlayer结构体3 SDL_Vout
  17. 物联网安全威胁与解决方案调研
  18. MATLAB中 DCT变换、DCT反变换、分块DCT变换
  19. 使用while循环语句与自增运算符循环遍历数组 (Java经典编程案例)
  20. OPENNI实践-体感方向盘玩赛车游戏(2)

热门文章

  1. ssm+jsp计算机毕业设计锦程公司物流运输车辆管理系统s5yl0(程序+lw+源码+远程部署).
  2. 无线短距离技术之ZigBee
  3. draco与threejs完美结合
  4. 杨杰matlab神经网络30例,MATLAB神经网络30例
  5. 【解决方案】AI视频结构化智能安防平台EasyCVR实现检察院大楼智能安防监控方案
  6. Objective-C系统原生图片下载方法封装
  7. CentOS 6.9时间与时间服务器相差1小时(时区问题,经过查看时区是蒙古时区,蒙古时区与亚洲上海时区相差1小时)
  8. 【物联网】基于LoRa的电子围栏方案设计实现
  9. 利用nginx制作文件下载链接
  10. 【我的Android进阶之旅】Android使用JNI的时候报native crash: A/libc: Fatal signal 4 (SIGILL), code 2 (ILL_ILLOPN)