猿辅导:迷宫(动态规划)

题目描述

  有一个N*M大小的迷宫矩阵,迷宫中的每个各自都有一个数值(R<10^9)。小猿在迷宫中发现,他只能朝着上下左右四个方向的相邻格子前进,并且只能进入比当前位置数值更大的格子。但是小猿有个紧急呼救按钮,它可以通过按下按钮,强行进入到不满足书纸大小要求的相邻格子,可惜这个按钮只能使用K次,请问小猿从这个迷宫任选一个格子出发,在紧急呼救按钮的帮助下,最多能走多少步?(开始位置计入步数,即站在起点是步数为1)。

输入描述

  第一行输入 N,M,K, 接下来N行,每行M个数,表示每个迷宫中各个格子的值。

  1<= N <= 500

  1<= M <= 500 

  0<= K <= 10

输入
3 3 1
1 3 3
2 4 9
8 9 2

输出
6

说明

其中一种方案:(0,0)->(0,1)->(0,0)->(1,0)->(2,0)->(2,1)

分析

  DP动态规划+DFS(深度优先搜索)

  1. 如果dp[x][y][k]不等于初始值的时候直接返回就可以了(dp[i][j][k]代表从i,j出发用k次机会最远的距离)
  2. 开始位置计入步数,即站在起点是步数为1
  3. 朝着上下左右四个方向的相邻格子前进,当前位置的最多能走步数 = max(当前位置的最多能走步数,相邻位置的最多能走步数+1)
    • 越界的话,无视并继续下一个
    • 只能进入比当前位置数值更大的格子
    • 通过按下按钮,强行进入到不满足书纸大小要求的相邻格子(k-1),可惜这个按钮只能使用K次
     if(mat[x][y] < mat[nx][ny])  dp[x][y][k] = Math.max(dp[x][y][k], dfs(nx, ny, k) + 1);
     if(mat[x][y] >= mat[nx][ny] && k > 0) dp[x][y][k] = Math.max(dp[x][y][k], dfs(nx, ny, k - 1) + 1);  
  4. 返回单个dp[i][j][k]代表从i,j出发用k次机会最远的距离
  5. 任选一个格子出发,在紧急呼救按钮的帮助下,最多能走多少步(所有的最大值)

代码

import java.util.Scanner;

public class Main {
    private static int dx[] = {0, 1, 0, -1};//用于迷宫的上下左右移动
    private static int dy[] = {1, 0, -1, 0};//用于迷宫的上下左右移动
    private static int N;//迷宫的行
    private static int M;//迷宫的列
    private static int K;//可以‘强行进入到不满足书纸大小要求的相邻格子‘的次数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        K = sc.nextInt();
        sc.nextLine();
        int [][] mat = new int[N][M];//迷宫的每个格子的数值
        for (int i = 0; i < N; i++) {
            String[] str = sc.nextLine().split(" ");
            for (int j = 0; j < M; j++) {
                mat[i][j] = Integer.valueOf(str[j]);
            }
        }
        int [][][] dp = new int[N][M][K+1];    //dp[i][j][k]代表从i,j出发用k次机会最远的距离
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                for (int k = 0; k <= K; k++) {
                    dp[i][j][k] = -1;//初始化
                }
            }
        }
        int maxresult = 0;     //任选一个格子出发,在紧急呼救按钮的帮助下,最多能走多少步
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                dp[i][j][K] = dfs(i, j, K, dp, mat);
                maxresult = Math.max(maxresult, dp[i][j][K]); //所有结果的最大值
            }
        }
        System.out.println(maxresult);
    }

    /**
     * DFS--DP动态规划
     * 一个记忆化搜索
     * 代表从 当前位置(x,y)出发用k次机会最多能走步数
     * @param x    当前位置(x,y)
     * @param y    当前位置(x,y)
     * @param k    用k次机会
     * @param dp dp[i][j][k]代表从i,j出发用k次机会最远的距离
     * @param mat    迷宫的每个格子的数值
     * @return
     */
    public static int dfs(int x, int y, int k, int[][][]dp,int[][]mat) {
        /**如果dp[x][y][k]不等于初始值的时候直接返回就可以了*/
        if(dp[x][y][k] != -1)
            return dp[x][y][k];
        /**开始位置计入步数,即站在起点是步数为1*/
        dp[x][y][k] = 1;
        /**朝着上下左右四个方向的相邻格子前进*/
        /** 当前位置的最多能走步数 = max(当前位置的最多能走步数,相邻位置的最多能走步数+1) **/
        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            /**越界的话,无视并继续下一个**/
            if(nx < 0 || nx >= N || ny < 0 || ny >= M)
                continue;
            /**只能进入比当前位置数值更大的格子*/
            if(mat[x][y] < mat[nx][ny])
                dp[x][y][k] = Math.max(dp[x][y][k], dfs(nx, ny, k, dp, mat) + 1);
            /**通过按下按钮,强行进入到不满足书纸大小要求的相邻格子(k-1),可惜这个按钮只能使用K次*/
            if(mat[x][y] >= mat[nx][ny] && k > 0)
                dp[x][y][k] = Math.max(dp[x][y][k], dfs(nx, ny, k - 1, dp, mat) + 1);
        }
        /**代表从 当前位置(x,y)出发用k次机会最多能走步数*/
        return dp[x][y][k];
    }
}

原文地址:https://www.cnblogs.com/haimishasha/p/11305133.html

时间: 2024-10-04 04:20:07

猿辅导:迷宫(动态规划)的相关文章

2017寒假猿辅导初等数论-3: &quot;素数与惟一分解定理(一)&quot;作业题解答

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程. 1. 证明: 对任意给定的正整数 $n$, 存在无穷多个正整数 $a$, 使 $n^4 + a$ 是合数. 解答: 令 $a = 4m^4$, $m\in\mathbf{Z}$, $$n^4 + 4m^4 = (n^2 + 2m^2)^2 - 4m^2n^2$$ $$= (n^2 + 2m^2 + 2mn)(n^2 + 2m^2 - 2mn)$$ 易知, $m > 1$ 时 $n^2 + 2m^

2017寒假猿辅导初等数论-2: &quot;带余除法&quot;作业题解答

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程. 1. 计算: $(5767, 4453)$, $(3141, 1592)$, $(136, 221, 391)$. 解答: $$(5767, 4453) = (4453, 1314) = (1314, 511) = (511, 292) = (292, 219) = (219, 73) = 73.$$ $$(3141, 1592) = (1592, 1549) = (1549, 43) = (43,

2016猿辅导初中数学竞赛训练营作业题解答-6

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. $(x + y + z)^5 - x^5 - y^5 - z^5$ 解答: $f(x, y, z)$ 是五次齐次对称式. 验证 $$f(-y, y, z) = z^5 + y^5 - y^5 - z^5 = 0$$ 因此 $x+y$, $y+z$, $z+x$ 均为 $f(x, y, z)$ 之因式 (需补充二次齐次对称式因式). 令 $$f(x, y, z) = (x +

2016猿辅导初中数学竞赛训练营作业题解答-13

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程. 1. 一轮船从重庆到上海要 $5$ 昼夜, 从上海到重庆要 $7$ 昼夜, 那么有一个木排从重庆漂到上海要多少昼夜? 解答: 设水流速度为 $x$, 则 $$x = \left(\frac{1}{5} - \frac{1}{7}\right) \div 2 = \frac{1}{35}.$$ 因此需要 $35$ 昼夜. 2. 十时与十一时之间, 两针在什么时刻成直线? 解答: $\Delta S =

2016猿辅导初中数学竞赛训练营作业题解答-5

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. 分解因式 $a^3 - 4a^2 + a + 6$. 解答: 令 $f(a) = a^3 - 4a^2 + a + 6$, 其有理根可能为 $\pm1$, $\pm2$, $\pm3$, $\pm6$. 注意到 $f(a)$ 奇次项与偶次项系数和相等 (等于 $2$), 因此 $f(-1) = 0$. 由综合除法可得: $$a^3 - 4a^2 + a - 6 = (a +

2016猿辅导初中数学竞赛训练营作业题解答-2

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 分解下列因式: 1. $(2x^2+5x)^2 - 2x^2 - 5x - 6$ 解答: $$(2x^2+5x)^2 - 2x^2 - 5x - 6 = (2x^2+5x)^2 - (2x^2 + 5x) - 6$$ $$= (2x^2 + 5x - 3)(2x^2 + 5x + 2)$$ $$= (2x - 1)(x + 3)(2x + 1)(x + 2).$$ 2. $x^4

2016猿辅导初中数学竞赛训练营作业题解答-9

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. 若 $\displaystyle{1\over n} - {1\over m} - {1\over n+m} = 0$, 则 $\displaystyle\left({m\over n} + {n \over m}\right)^2 = ?$ 解答: $${1\over n} - {1\over m} = {1\over n + m} \Rightarrow m^2 - n

2016猿辅导初中数学竞赛训练营作业题解答-8

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. 若 $a^2 + 2a + 5$ 是 $a^4 + ma^2 + n$ 的一个因式, 那么 $mn$ 的值是多少? 解答: 待定系数法求解. 令 $a^4 + ma^2 + n = (a^2 + 2a + 5)(a^2 + pa + q)$, 则 $$\begin{cases}p + 2 = 0\\ 5 + q + 2p = m\\ 5q = n\\ 2q + 5p = 0

2016猿辅导初中数学竞赛训练营作业题解答-7

扫描以下二维码下载并安装猿辅导App, 打开后请搜索教师姓名"赵胤"即可报名本课程(14次课, 99元). 1. 若 $3x^2 - x = 1$, 则 $6x^3 + 7x^2 - 5x + 2016$ 的值是多少? 解答: $$6x^3 + 7x^2 - 5x + 2016 = 2x(3x^2 - x - 1) + 9x^2 - 3x + 2016$$ $$= 9x^2 - 3x + 2016 = 3(3x^2 - x - 1) + 2019 = 2019.$$ 2. 多项式 $2