题目描述

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 3 2
1 2 3
2 1 5

样例输出

14

思路

这道题可以用搜索递归的方法去做,但是在做递归的时候需要用到记忆化搜索,否则就会出现超时,再具体到题目,可以从3个方面入手:
1.如果格子中的物品价值比自己物品最大价值大,那么就选取。

2.如果格子中的物品价值比自己物品最大价值大,那么就不选取

3.如果格子中的物品价值比自己物品最大价值小,那么就不选取

由于对于2.3都是不选取,所以可以将其归并为一类,即,不选取格子中的物品,则变成两个方面。

#include<iostream>
#include<cstring>
using namespace std;
int n,m,k;
int map[55][55];
const int Mod = 1000000007;
long long dp[55][55][14][14];//用来存储结果,记忆化搜索
long long dfs(int x,int y,int count,int max)
{if(dp[x][y][count][max+1] != -1)//将该数组初始化为-1,若不等于-1,该点的结果已经搜索过return dp[x][y][count][max+1];long long ans = 0;if(x == n+1 || y == m+1 || count > k)  //该数组越界,或者所拿的宝物数量超过了k件return 0;int t = map[x][y];if(x == n && y == m)    //到达最后一个格子,有两种情况,方案数都需要加一{if(count == k || (count == k-1 && t > max)){ans++;ans = ans%Mod;}return ans;}if(t > max)      //可以拿走宝物{ans += dfs(x,y+1,count+1,t);//向右走ans += dfs(x+1,y,count+1,t);//向下走}//价值小不拿该宝物或价值大选择不拿该宝物ans += dfs(x,y+1,count,max);    ans += dfs(x+1,y,count,max);dp[x][y][count][max+1] = ans%Mod;return ans%Mod;}
int main()
{memset(dp,-1,sizeof(dp));cin>>n>>m>>k;for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)cin>>map[i][j];cout<<dfs(1,1,0,-1)<<endl;//这里的max要为-1,因为有的宝物的价值可以取0,所以取得的宝物数为0时,max应该取-1.return 0;
}

[蓝桥杯][2014年第五届真题]地宫取宝相关推荐

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

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

  2. 问题 1819: [蓝桥杯][2014年第五届真题]Log大侠

    问题 1819: [蓝桥杯][2014年第五届真题]Log大侠 时间限制: 1Sec 内存限制: 128MB 提交: 236 解决: 173 题目描述  atm参加了速算训练班,经过刻苦修炼,对以2为 ...

  3. 蓝桥杯2014年第五届真题-六角填数

    题目 如图所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 题解 全 ...

  4. [蓝桥杯][2014年第五届真题]排列序数(思维)

    题目描述 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bac ...

  5. [蓝桥杯][2014年第五届真题]稍大的串(STL)

    题目描述 串可以按照字典序进行比较.例如: abcd 小于 abdc 如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些.科学地说:它是 ...

  6. [蓝桥杯][2014年第五届真题]生物芯片(数论)

    题目描述 X博士正在研究一种生物芯片,其逻辑密集度.容量都远远高于普通的半导体芯片. 博士在芯片中设计了 n 个微型光源,每个光源操作一次就会改变其状态,即:点亮转为关闭,或关闭转为点亮. 这些光源的 ...

  7. [蓝桥杯][2014年第五届真题]兰顿蚂蚁(模拟)

    题目描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只"蚂蚁". 蚂蚁的头部朝向为:上下左 ...

  8. [蓝桥杯][2014年第五届真题]分糖果-模拟

    题目描述 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从 ...

  9. [蓝桥杯][2014年第五届真题]兰顿蚂蚁-模拟

    题目描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只"蚂蚁". 蚂蚁的头部朝向为:上下左 ...

最新文章

  1. Windows中通过bat定时执行命令和mysqldump实现数据库备份
  2. 【Python】Python语言学习:设计模式、单例模式
  3. C++编程【Visual Studio 2017 环境搭建教程】【附:软件安装包】
  4. Linux下判断cpu物理个数、几核
  5. 漫步凸分析三——凸集代数
  6. 菜鸟学习笔记:Java提升篇1(容器1——List)
  7. sql数据库性能指标_SQL Server网络性能指标–最重要的指标
  8. Node对CommonJS模块的实现
  9. java 传xml js_JavaScript实现的XML与JSON互转功能详解
  10. 如何去读Binder的源码
  11. NULL指针的奇妙之旅
  12. Python制作PPT周报
  13. 友善串口工具 电子秤_Serial Port Utility
  14. MySQL数据库W版与L版转换_mysql博文总结
  15. 闪存颗粒-2D和3D闪存之间的区别和联系
  16. 特种浓缩分离:全自动型拉板式压滤机
  17. phpstorm配置vcs自动上传代码
  18. a19_Python文件I/O---学习笔记
  19. 聚类dbi指数_聚类-K-Means
  20. Python: queue.Queue

热门文章

  1. 如何下载Homo_sapiens.GRCh38.100.gtf.gz和Homo_sapiens.GRCh37.87.gtf.gz参考基因组注释文件
  2. 《Python编程 从入门到实践》 一、基础知识 第二章 变量和简单的数据类型
  3. 如何mysql数据库输出为jone_我们可以通过单个MySQL查询获得记录“ Jone Deo”或“ Deo Jone”吗?...
  4. virsh 创建一个虚拟交换机,虚拟网络
  5. 蓝桥1+x java中级 看了就过关
  6. uniapp垂直滚动公告栏,可上下拖动内容
  7. 前端设计(动态,渐变)
  8. Web基础之与Tomcat的初次相遇
  9. SSVEP方块闪烁刺激界面编写
  10. Android 内置字体 medium,我在字体家族Android Studio中找不到sans-serif-medium