力扣LCR 166. 珠宝的最高价值(java 动态规划)

发布时间:2024年01月11日

Problem: LCR 166. 珠宝的最高价值

解题思路

在这里插入图片描述在这里插入图片描述

思路

改题目与本站64题实质上是一样的,该题目在64题的基础上将求取最小路径和改成了求取最大路径和。具体实现思路如下:

1.定义一个int类型的二维数组dp大小为给定矩阵frame的行数与列数。该数组用于记录每个当前阶段的最大路径和(也是本题目的最大价值)
2.动态转移方程为**dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + frame[i][j];**即当前位置(也可以记作阶段)最大值每次取出其上方,和左侧的较大值的一个与当前frame位置值作和;
3.由于dp数组中第一行与第一列无法直接执行动态转移方程,要对其初始化:第一行每个位置值为依次向右累加第一列每个位置值为依次向下累加
3.最后返回dp数组中的最后一个值即可。

解题方法

1.定义数组frame的行数rows与列数columns;并定义一个int变量temp用于记录累加和
2.定义并初始化int类型数组dp初始化为new int[rows][colunms]
3.初始化dp的第一行与第一列,在for循环中使temp依次累加当前第一行(列)位置的值,并赋值给当前dp数组位置;
4.从dp数组的第二行(索引为1)开始执行动态转移方程dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + frame[i][j];,最后返回dp[rows - 1][columns - 1];

复杂度

时间复杂度:

O ( M N ) O(MN) O(MN),其中 M M M为数组frame的行数, N N N为其列数

空间复杂度:

O ( M N ) O(MN) O(MN)

Code

class Solution {
    /**
     * The maximum path sum is obtained using dynamic programming
     *
     * @param frame Given matrix
     * @return int
     */
    public int jewelleryValue(int[][] frame) {
        int rows = frame.length;
        int columns = frame[0].length;
        int temp = 0;
        //Records the current maximum path sum
        int[][] dp = new int[rows][columns];
        //Handle the first row and column
        for (int i = 0; i < columns; ++i) {
            temp += frame[0][i];
            dp[0][i] = temp;
        }
        temp = 0;

        for (int j = 0; j < rows; ++j) {
            temp += frame[j][0];
            dp[j][0] = temp;
        }

        //Dynamic transfer equation
        for (int i = 1; i < rows; ++i) {
            for (int j = 1; j < columns; ++j) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + frame[i][j];
            }
        }
        return dp[rows - 1][columns - 1];
    }
}
文章来源:https://blog.csdn.net/LNsupermali/article/details/135540971
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。