问题描述
  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
暴力dfs会超时,可以dp或者记忆化搜索....理解可以...自己写可能就....gg了...
这样的话,感觉还是记忆化搜索更萌一些,因为不用考虑那么多边界...
思路见代码.
dp:
/*
蓝桥杯历届试题地宫寻宝dp
状态:dp[i][j][num][val] 表示从起点(1, 1)走到(i, j), 已经取了num个宝物,最大价值是val 的方案数。
初态:dp[1][1][0][0] = 1; dp[1][1][1][mp[1][1]] = 1;
转移方程:由上方或者左方的格子转移而来,详见代码;
*/#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;#define mod 1000000007
int dp[55][55][15][15];
int mp[55][55];int main() {int n, m, k;while(~scanf("%d%d%d", &n, &m, &k)) {for (int i=1; i<=n; ++i) {for (int j=1; j<=m; ++j) {scanf("%d", &mp[i][j]);}}memset(dp, 0, sizeof(dp));dp[1][1][0][0] = 1;dp[1][1][1][mp[1][1]] = 1;for (int i=1; i<=n; ++i) {for (int j=1; j<=m; ++j) {dp[i][j][0][0] += (dp[i-1][j][0][0] + dp[i][j-1][0][0]);dp[i][j][0][0] %= mod;for (int num=1; num<=k; ++num) {for (int val=0; val<=12; ++val) {dp[i][j][num][val] += (dp[i-1][j][num][val] + dp[i][j-1][num][val]);dp[i][j][num][val] %= mod;}if (num == 1) {dp[i][j][1][mp[i][j]] += dp[i-1][j][0][0];dp[i][j][1][mp[i][j]] %= mod;dp[i][j][1][mp[i][j]] += dp[i][j-1][0][0];dp[i][j][1][mp[i][j]] %= mod;}else {for (int t=0; t<mp[i][j]; ++t) {dp[i][j][num][mp[i][j]] += dp[i-1][j][num-1][t];dp[i][j][num][mp[i][j]] %= mod;dp[i][j][num][mp[i][j]] += dp[i][j-1][num-1][t];dp[i][j][num][mp[i][j]] %= mod;}}}}}int ans = 0;for (int i=0; i<=12; ++i) {ans += dp[n][m][k][i];ans %= mod;}printf("%d\n", ans);}return 0;
}

记忆化搜索:

/*
蓝桥杯历届试题 地宫取宝dp[i][j][num][k] 表示到位置(i, j)时, 取了第num个宝藏,最大宝藏值是k时,
能到终点的路线方案数。dfs超时。
记忆化搜索...
*/#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define mod 1000000007int dp[55][55][15][15];
int n, m, k;
int mp[55][55];int dfs(int nowx, int nowy, int cnt, int nowMax) {if (dp[nowx][nowy][cnt][nowMax+1] != -1) {return dp[nowx][nowy][cnt][nowMax+1];}int ans = 0;if (nowx == n-1 && nowy == m-1) {if (mp[nowx][nowy] > nowMax) {if (cnt == k || cnt == k-1)ans++;ans %= mod;}else if (cnt == k) ans++;ans %= mod;return dp[nowx][nowy][cnt][nowMax+1] = ans;}if (nowx+1 < n) {if (mp[nowx][nowy] > nowMax) {ans += dfs(nowx+1, nowy, cnt+1, mp[nowx][nowy]);ans %= mod;}ans += dfs(nowx+1, nowy, cnt, nowMax);ans %= mod;}if (nowy+1 < m) {if (mp[nowx][nowy] > nowMax) {ans += dfs(nowx, nowy+1, cnt+1, mp[nowx][nowy]);ans %= mod;}ans += dfs(nowx, nowy+1, cnt, nowMax);ans %= mod;}return dp[nowx][nowy][cnt][nowMax+1] = ans;
}int main() {while(~scanf("%d%d%d", &n, &m, &k)) {memset(dp, -1, sizeof(dp));for (int i=0; i<n; ++i) {for (int j=0; j<m; ++j) {scanf("%d", &mp[i][j]);}}int ans = dfs(0, 0, 0, -1);printf("%d\n", ans);}return 0;
}

  

转载于:https://www.cnblogs.com/icode-girl/p/5522669.html

蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索相关推荐

  1. [蓝桥杯][算法提高VIP]夺宝奇兵(记忆化搜索||DP)

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  2. 蓝桥杯 历届试题 地库取宝(深搜 dfs)----------C语言—菜鸟级

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

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

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

  4. 【蓝桥杯】历届试题 地宫取宝

     历届试题 地宫取宝 时间限制:1.0s   内存限制:256.0MB      问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口 ...

  5. [蓝桥杯][算法提高VIP]数的划分(记忆化搜索)

    题目描述 一个正整数可以划分为多个正整数的和,比如n=3时: 3:1+2:1+1+1: 共有三种划分方法. 给出一个正整数,问有多少种划分方法. 数据规模和约定 n< =100 输入 一个正整数 ...

  6. 蓝桥杯c语言试题幸运数,蓝桥杯  历届试题 幸运数  dfs

    时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,. ...

  7. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  8. [蓝桥杯][历届试题]国王的烦恼(反向+并查集)

    问题 1435: [蓝桥杯][历届试题]国王的烦恼 时间限制: 1Sec 内存限制: 128MB 提交: 802 解决: 213 题目描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了 ...

  9. 蓝桥杯 - 历届试题 - 日期问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_33531813/article/details/79516258 </div>&l ...

最新文章

  1. EventBus3.0源码解析
  2. Final变量的含义
  3. 前端学习(3248):react的生命周期getSnapBeforeUpdate举例
  4. 量化感知训练_如何评估训练质量?常被训练者忽视的内部负荷
  5. 以太网的phy寄存器分析
  6. sh mysql configure_【翻译自mos文章】使用config.sh/config.bat来configureorre-con
  7. VSCode配置jupyter逐行语句运行python
  8. 数据类产品设计和实现思路
  9. php安全上传图片,PHP安全上传图片的方法
  10. 计算机控制系统模型,计算机控制系统的数学模型.ppt
  11. 推荐书籍 《半小时漫画经济学1--生活常识篇》
  12. 未来,你会反感虚拟现实沉浸式广告吗?
  13. dango mysql 的问题
  14. ngx 之 location
  15. openwrt折腾记3-开通ipv6(二级路由)
  16. Linux命令zip:压缩文件夹时,排除指定文件或文件夹
  17. Tello无人机马达更换
  18. 【历史】- UNIX发展史(BSD,GNU,linux)
  19. SpringBoot 错误页面使用、自定义错误页、自定义异常、自定义异常解析器
  20. Appium安装指南

热门文章

  1. [03] Android系统亮度调节
  2. 中国计算机学会第七届全国Web信息系统及其应用学术会议(WISA2010)征文通知
  3. Mybatis if标签和where标签结合巧妙使用
  4. AngularJS中实现显示或隐藏动画效果的3种方式
  5. (4.28)for xml path 在合并拆分上的作用演示
  6. MSSql Server 自定义导出
  7. 51nod 1013快速幂 + 费马小定理
  8. 字符串赋值方式理解 sizeof 和strlen的一些区别
  9. Centos 6.5 X64 环境下编译 hadoop 2.6.0 --已验证
  10. cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox