蓝桥杯 历届试题 地宫取宝
2016-04-08 10:54
274 查看
历届试题 地宫取宝
时间限制:1.0s 内存限制:256.0MB
锦囊1
锦囊2
锦囊3
问题描述
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
时间限制:1.0s 内存限制:256.0MB
锦囊1
锦囊2
锦囊3
问题描述
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
//借鉴了一下别人的代码,思路不太好想,开始用深搜但是没有记忆化处理,各种错误!!! //没弄明白for里面为什么先写物品件数,后写价值。。 #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long LL; //这里我用long long保存的中间结果 const int MOD = 1000000007; int n,m,k; int dp[55][55][15][15]; // 位置横坐标,位置纵坐标,捡起宝物中最大价值,手上物品的件数 int map[55][55]; int main() { while(scanf("%d%d%d",&n,&m,&k) != EOF) { memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d", &map[i][j]); map[i][j]++; } dp[1][1][0][0] = 1; dp[1][1][map[1][1]][1] = 1; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { if(i == 1 && j == 1) continue; for(int v = 0; v <= k; v++) { for(int f = 0; f <= 13; f++) { if(f < map[i][j]) //这里指的是捡起地上东西的情况 { dp[i][j][map[i][j]][v+1] = (LL)(dp[i][j][map[i][j]][v+1] + dp[i][j-1][f][v])%MOD; dp[i][j][map[i][j]][v+1] = (LL)(dp[i][j][map[i][j]][v+1] + dp[i-1][j][f][v])%MOD; } //没有捡起 dp[i][j][f][v] = (LL)(dp[i-1][j][f][v] + dp[i][j][f][v]) % MOD; dp[i][j][f][v] = (LL)(dp[i][j-1][f][v] + dp[i][j][f][v]) % MOD; } } } } int ans = 0; for(int i = 0; i <= 13; i++) //所有取到k件物品的情况都加起来,计算过程中不要忘了取模 ans = (dp [m][i][k] + ans)%MOD; printf("%d\n", ans); } return 0; }
相关文章推荐
- oracle的jdbc连接方式:oci和thin
- linux下vi命令大全
- 表单2016/4/8
- Hadoop2.2.0环境下Sqoop1.99.3安装
- 移动端尺寸基础知识
- Map对象的浅拷贝与深拷贝
- Bootstrap-panel
- ownCloud简介
- C++第二次上机实验
- Linux流量实时监控工具iftop安装配置
- 计算机图形学(一) 视频显示设备_2_光栅扫描显示器
- HashMap源码注解 之 成员变量(二)
- 苹果IOS开发者账号总结
- ios runtime基础知识
- Linux scp --Secure copy 远程拷贝文件
- Linux sar --系统性能分析工具
- Linux rz --批量上传文件
- android 开发,百度地图 UI 控制器常用方法及作用
- Django - Model graphic representation (ERD) - Stack Overflow
- YJX_Driver_029_实战EXE和SYS通信(直接访问模式)