珠宝的最高价值
难度:
标签:
题目描述
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)
代码细节讲解
🦆
在递归版本的动态规划中,如何确保不会因为递归层数过深而导致栈溢出?
▷🦆
为什么在动态规划的递归实现中选择使用字典来存储中间结果,而不是使用二维数组?
▷🦆
在`dp(i, j) = max(dp(i, j-1), dp(i-1, j)) + grid[i][j]`的转移方程中,如果grid的某个值非常大,是否会对最终结果产生不成比例的影响?
▷