算法笔记_174:历届试题 地宫取宝(Java)
目录
1 问题描述
地宫的入口在左上角,出口在右下角。
小明被带到地宫的入口,国王要求他只能向右或向下行走。
走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。
当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。
请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
1 2
2 1
1 2 3
2 1 5
2 解决方案
本文下面代码详解请见文末参考资料。

具体代码如下:
import java.util.Scanner;
public class Main {
    public static int n, m, k;
    public static long MOD = 1000000007;
    public static int[][] map;
    public static long[][][][] visited = new long[51][51][102][13];
    public long dfs(int x, int y, int num, int max) {
        if(visited[x][y][num][max + 1] != -1)
            return visited[x][y][num][max + 1];
        if(x == n - 1 && y == m - 1) {
            if(num == k)
                visited[x][y][num][max + 1] = 1;
            else if(num == k - 1 && max < map[x][y])
                visited[x][y][num][max + 1] = 1;
            else
                visited[x][y][num][max + 1] = 0;
            return visited[x][y][num][max + 1];
        }
        long result = 0;
        if(x + 1 < n) {  //向下移动一步
            if(max < map[x][y]) {
                result += dfs(x + 1, y, num + 1, map[x][y]);
                result %= MOD;
            }
            result += dfs(x + 1, y, num, max);
            result %= MOD;
        }
        if(y + 1 < m) {   //向右移动一步
            if(max < map[x][y]) {
                result += dfs(x, y + 1, num + 1, map[x][y]);
                result %= MOD;
            }
            result += dfs(x, y + 1, num, max);
            result %= MOD;
        }
        return visited[x][y][num][max + 1] = result % MOD;
    }
    public static void main(String[] args) {
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        k = in.nextInt();
        map = new int[n][m];
        for(int i = 0;i < n;i++)
            for(int j = 0;j < m;j++)
                map[i][j] = in.nextInt();
        for(int i = 0;i < 51;i++)
            for(int j = 0;j < 51;j++)
                for(int x = 0;x < 102;x++)
                    for(int y = 0;y < 13;y++)
                        visited[i][j][x][y] = -1;
        test.dfs(0, 0, 0, -1);
        System.out.println(visited[0][0][0][0]);
    }
}
参考资料:
算法笔记_174:历届试题 地宫取宝(Java)的更多相关文章
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
		问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ... 
- 算法笔记_176:历届试题 最大子阵(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入 ... 
- 算法笔记_189:历届试题 横向打印二叉树(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树 ... 
- Java实现 蓝桥杯 历届试题 地宫取宝
		问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ... 
- 算法笔记_180:历届试题 国王的烦恼(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲 ... 
- 算法笔记_185:历届试题 格子刷油漆(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可 ... 
- 算法笔记_198:历届试题 打印十字图(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示: ..$$$$$$$$$$$$$....$...........$..$$ ... 
- 算法笔记_191:历届试题 大臣的旅费(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考, ... 
- 算法笔记_182:历届试题 核桃的数量(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 1. ... 
随机推荐
- 解决IE11下载文件  文件名乱码问题
			1.Win + R输入gpedit.msc打开组策略编辑器:(不会请看下图) 2.定位到计算机配置→管理模板→windows组件→Internet Explorer→自定义用户代理字符串(有些系统用的 ... 
- Go语言Web框架gwk介绍 (五)
			Session Go的net/http本身不带session的机制,需要开发人员自行实现,gwk实现了内存中的session存储机制,如果需要将session存在其他地方比如redis或者memcac ... 
- JTAG/SPI/ISP/ICSP 接口电路
- 5V and 3V Level Translators
			http://www.daycounter.com/Circuits/Level-Translators/Level-Translators.phtml Interfacing 5V and 3V l ... 
- 【《Objective-C基础教程 》笔记ch03】(四)OC中的OOP
			一.声明类接口步骤: 1.声明一个类接口,使用@interfacekeyword加上类名称. 2.用 { 实例变量 } 来定义各种数据成员. 3.方法声明,採用中缀符语法声明一个c函数,用到了冒号 ... 
- andriod获得应用程序的Context
			getApplicationContext() getResources().getString(R.string.app_name) //获得程序名称 
- 【docker】elasticsearch-head无法连接elasticsearch的原因和解决,集群健康值:未连接,ElasticSearch——跨域访问的问题
			环境 ==================== 虚拟机启动 centos 7 ip:192.168.92.130 elasticsearch 5.6.9 port:9200 9201 elas ... 
- coursera课程Text Retrieval and Search Engines之Week 1 Overview
			Week 1 OverviewHelp Center Week 1 On this page: Instructional Activities Time Goals and Objectives K ... 
- @JVM中对象的引用类型
			JVM中有四种引用类型:强引用.软引用.弱引用.虚引用 强引用(Stong Reference):是指在程序代码中普遍存在的,类似:Object obj = new Object()这类的引用,只 ... 
- 35个Jquery应用实例
			Jquery库及相应插件如今红遍网络,收集了网络上有关JQuery的35个精彩使用例子,在此统一展示供JQuery使用时的查询. 1. 选择网页元素jQuery的基本设计和主要用法,就是" ... 
