leetcode
leetcode 2601 ~ 2650
珠宝的最高价值

珠宝的最高价值

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 88 ms, 内存: 20.3 MB


/*
 * 思路:
 * 使用Java Stream API不能直接进行动态规划,但可以通过传统的方式计算后进行展示。
 * 这里我们先计算dp数组,然后将结果通过流的方式展示。
 */

import java.util.Arrays;

public class Solution {
    public int maxValue(int[][] frame) {
        int rows = frame.length;
        int cols = frame[0].length;
        int[][] dp = new int[rows][cols];
        dp[0][0] = frame[0][0];
        for (int i = 1; i < rows; i++) {
            dp[i][0] = dp[i-1][0] + frame[i][0];
        }
        for (int j = 1; j < cols; j++) {
            dp[0][j] = dp[0][j-1] + frame[0][j];
        }
        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < cols; j++) {
                dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + frame[i][j];
            }
        }
        Arrays.stream(dp).map(Arrays::toString).forEach(System.out::println);
        return dp[rows-1][cols-1];
    }
}

解释

方法:

这个题解采用了动态规划的方法来解决问题。动态规划的思路是通过将原问题分解为相对简单的子问题来求解原问题。在这个问题中,我们定义dp(i, j)为从左上角到达(i, j)位置时能拿到的最高价值的珠宝。那么dp(i, j)可以通过其左边的格子dp(i, j-1)和上边的格子dp(i-1, j)转移而来,转移方程为dp(i, j) = max(dp(i, j-1), dp(i-1, j)) + grid[i][j]。我们使用一个字典memo来存储已经计算过的dp值,以避免重复计算。

时间复杂度:

O(m*n)

空间复杂度:

O(m*n)

代码细节讲解

🦆
在递归版本的动态规划中,如何确保不会因为递归层数过深而导致栈溢出?
在递归版本的动态规划中,确保不会因为递归层数过深导致栈溢出的关键方法是通过使用备忘录(memoization)技术来减少递归的调用次数。在给定问题的实现中,每个状态(即每个格子的最高价值)在第一次计算后就被存储在字典memo中。后续对相同状态的访问将不再触发递归调用,而是直接从字典中取值。这种方法有效地将问题的递归深度限制在格子的总数内,从而避免了由于递归层数过深而导致的栈溢出问题。此外,对于非常大的输入数据,可以考虑使用迭代动态规划或其他非递归方法来避免递归限制。
🦆
为什么在动态规划的递归实现中选择使用字典来存储中间结果,而不是使用二维数组?
在动态规划的递归实现中选择使用字典而不是二维数组来存储中间结果的原因主要是灵活性和空间效率。使用字典存储中间结果时,只需要为已经计算过的状态分配空间,这在稀疏数据情况下可以节省大量的内存。此外,字典的键可以是任意可哈希的数据类型,这为状态的表示提供了更大的灵活性。相比之下,二维数组需要预先为所有可能的状态分配空间,无论这些状态是否会被实际访问,这在某些情况下可能会导致内存的浪费。
🦆
在`dp(i, j) = max(dp(i, j-1), dp(i-1, j)) + grid[i][j]`的转移方程中,如果grid的某个值非常大,是否会对最终结果产生不成比例的影响?
在`dp(i, j) = max(dp(i, j-1), dp(i-1, j)) + grid[i][j]`的转移方程中,如果grid中某个具体位置的价值非常大,确实会对最终结果产生显著的影响。这是因为动态规划求解的是最大价值路径问题,每个格子的价值直接加入到路径总价值中。因此,任何特别高的格子价值都将直接增加通过该格子的路径的总价值。这种设计是题目本身的特性所致,目的在于找到价值最大的路径。如果需要减少单个格子对总价值的影响,可能需要调整问题的设定或引入额外的规则,例如限制最大值或者引入权重。

相关问题