蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
1 2
2 1
1 2 3
2 1 5
/*
蓝桥杯历届试题地宫寻宝 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 1000000007 int 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;
}
蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索的更多相关文章
- Java实现 蓝桥杯 历届试题 地宫取宝
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- 算法笔记_174:历届试题 地宫取宝(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明 ...
- 【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57148470 Descrition 首先很明显是 ...
- 二进制数(dp,记忆化搜索)
二进制数(dp,记忆化搜索) 给定k个<=1e6的正整数x(k不大于10),问最小的,能被x整除且只由01组成的数. 首先,dp很好写.用\(f[i][j]\)表示i位01串,模ki的值是j的数 ...
- poj1179 区间dp(记忆化搜索写法)有巨坑!
http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...
- 【BZOJ3769】spoj 8549 BST again DP(记忆化搜索?)
[BZOJ3769]spoj 8549 BST again Description 求有多少棵大小为n的深度为h的二叉树.(树根深度为0:左右子树有别:答案对1000000007取模) Input 第 ...
- HDU 3652 B-number(数位dp&记忆化搜索)
题目链接:[kuangbin带你飞]专题十五 数位DP G - B-number 题意 求1-n的范围里含有13且能被13整除的数字的个数. 思路 首先,了解这样一个式子:a%m == ((b%m)* ...
- 【CF607B】Zuma——区间dp(记忆化搜索/递推)
以下是从中文翻译成人话的题面: 给定一个长度小于等于500的序列,每个数字代表一个颜色,每次可以消掉一个回文串,问最多消几次可以消完? (7.16) 这个题从洛谷pend回来以后显示有103个测试点( ...
随机推荐
- Android中利用SharedPreferences保存信息
package com.example.sharepreferen; import android.content.Context; import android.content.SharedPref ...
- iOS - TouchLock 手势解锁
1.手势解锁的创建 代码封装见 QExtension QLockView.h #import <UIKit/UIKit.h> @interface QLockView : UIView / ...
- Spring事务配置
Spring中事务的配置学习: 1.心法 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一 ...
- 百度web前端面试2015.10.18
邮件里通知的周日下午两点参加百度校招面试,我13:10分就到了,前台先让我拿了个面试资格单(上面是我的信息),然后在web前端面试入口排队,面试在百度食堂举行的,等了大概1个小时,放我去面试.都是一对 ...
- mysql 事件调度器
1.mysql事件调度器,也就是计划任务,计划做某事,有两种方式: 2.在某个时间点做某事,AT TIMESTAMP [+ INTERVAL INTERVAL] 某个时间点加上偏移. 3.定时地做某事 ...
- Python中的__new__()方法的使用
__new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object: @staticmethod # known cas ...
- Git的优势
分布式,强调个体 公共服务器压力和数据量都不会太大 速度快.灵活 任意两个开发者之间可以很容易的解决冲突 离线工作
- ios 开发之 Xcode6 No valid signing identities (i.e. certificate and private key pair) matching...
之前的项目用证书真机测试过,我想再无证书Build,出现下面的报错提示! 下面的team我无法改成None!一点击None选的还是Unhonw name(JPGE28K3W9)这个是报错的关键 最后由 ...
- C++——代码重用
一.包含对象成员的类 接口和实现:使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口.不 ...
- JAVA EE 第一阶段项目问题
一: 乱码 原因: 由于同组的其他同学的myeclipse默认的编码方式是GBK,而我的默认的是UTF-8.所以当我使用svn把其他同学提交到组长那里去的代码下载下来的时候,就全乱码了! 解决问题: ...