博客
关于我
AcWing 901. 滑雪 (搜索优化为dp)
阅读量:344 次
发布时间:2019-03-04

本文共 2923 字,大约阅读时间需要 9 分钟。

为了解决这个问题,我们需要找到二维矩阵中最长的滑雪轨迹。滑雪轨迹的定义是从某个区域出发,每次只能向上、下、左、右滑动一个单位距离,并且只能滑向高度比当前位置低的相邻区域。

方法思路

我们可以使用动态规划来优化这个问题。动态规划通过预先计算每个区域的最大可能滑动长度,从而避免重复计算。具体步骤如下:

  • 读取输入并构建矩阵:读取矩阵的尺寸R和C,然后读取矩阵中的数据。
  • 初始化动态规划数组:创建一个dp数组,dp[i][j]表示从(i, j)出发可以滑动到的最长路径长度。
  • 按照高度从高到低排序:确保处理较高的区域在前,较低的区域在后。
  • 遍历每个区域:对于每个区域,检查其四个相邻区域(上、下、左、右)。如果相邻区域的高度低于当前区域的高度,更新当前区域的dp值。
  • 找到最大的dp值:遍历dp数组,找出最大的值作为最长滑雪轨迹的长度。
  • 解决代码

    import java.io.*;
    class Main {
    static int N = 310;
    static int[][] t = new int[N][N];
    static int[][] dp = new int[N][N];
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    public static void main(String[] args) throws Exception {
    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
    String[] params = buf.readLine().split(" ");
    int r = Integer.valueOf(params[0]);
    int c = Integer.valueOf(params[1]);
    for (int i = 1; i <= r; ++i) {
    String[] info = buf.readLine().split(" ");
    for (int j = 1; j <= c; ++j) {
    t[i][j] = Integer.valueOf(info[j-1]);
    }
    }
    // 按照高度从高到低排序
    int[][] sorted = new int[R+1][C+1];
    for (int i = 1; i <= r; ++i) {
    for (int j = 1; j <= c; ++j) {
    sorted[i][j] = t[i][j];
    }
    }
    // 按照高度从高到低排序后的坐标
    List
    coords = new ArrayList<>();
    for (int i = 1; i <= r; ++i) {
    for (int j = 1; j <= c; ++j) {
    coords.add(new int[]{i, j, t[i][j]});
    }
    }
    // 按高度从高到低排序
    Collections.sort(coords, new Comparator
    () {
    @Override
    public int compare(int[] a, int[] b) {
    return Integer.compare(a[2], b[2]);
    }
    });
    for (int i = 1; i <= r; ++i) {
    for (int j = 1; j <= c; ++j) {
    dp[i][j] = 1; // 每个点至少可以滑动自己
    }
    }
    for (int[] coord : coords) {
    int a = coord[0];
    int b = coord[1];
    for (int dir = 0; dir < 4; ++dir) {
    int x = a + dx[dir];
    int y = b + dy[dir];
    if (x >= 1 && x <= r && y >= 1 && y <= c) {
    if (t[a][b] > t[x][y]) {
    dp[a][b] = Math.max(dp[a][b], dp[x][y] + 1);
    }
    }
    }
    }
    int max = 1;
    for (int i = 1; i <= r; ++i) {
    for (int j = 1; j <= c; ++j) {
    if (dp[i][j] > max) {
    max = dp[i][j];
    }
    }
    }
    System.out.print(max);
    }
    }

    代码解释

  • 读取输入:从标准输入读取矩阵的尺寸和数据,构建矩阵t。
  • 排序处理:将矩阵中的每个元素按照高度从高到低排序,确保处理较高的区域在前。
  • 动态规划初始化:创建dp数组,初始值为1,因为每个区域至少可以滑动到自己。
  • 更新dp数组:对于每个区域,检查其四个相邻区域,如果相邻区域的高度低于当前区域的高度,更新当前区域的dp值。
  • 寻找最大值:遍历dp数组,找到最大的值作为最长滑雪轨迹的长度。
  • 这种方法通过动态规划优化了暴力解法,确保在合理的时间复杂度内解决问题。

    转载地址:http://syre.baihongyu.com/

    你可能感兴趣的文章
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! fatal: unable to connect to github.com:
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>
    npm install 报错 fatal: unable to connect to github.com 的解决方法
    查看>>
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>