File tree Expand file tree Collapse file tree 2 files changed +71
-0
lines changed
LeetCode/剑指offer/day9_动态规划(中等) Expand file tree Collapse file tree 2 files changed +71
-0
lines changed Original file line number Diff line number Diff line change 1+ // 题目链接:https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/?envType=study-plan&id=lcof
2+ // day9/31
3+ // 第 9 天主题为:动态规划(中等)
4+ // 包含两道题目:
5+ // 剑指offer42.连续子数组的最大和
6+ // 剑指offer47.礼物的最大价值
7+
8+ package main
9+
10+ //经典二维dp,在每个网格的位置有两个选择,向右 或 向下走,当前网格可获得的最大礼物价值,
11+ //就只能从其上面的格子或左边的格子 的最大礼物价值 加上当前格子的礼物价值 得到,回溯到起始节点,容易想到用 dp 解题。
12+ //动态规划三步骤:
13+ //1. 确定dp数组大小及下标含义:dp[i][j] 代表 从棋盘左上角走到 (i,j) 下标位置可以获得的礼物最大价值,
14+ // 则 len(dp) = len(grid),len(dp[0])=len(grid[0]),即 大小与给定棋盘大小相等;
15+ //2. dp数组初始化:(一般情况下初始第一行和第一列)网格(0,0)为起始位置,dp[0][0] 没有别的选择,dp[0][0] = grid[0][0]
16+ // 因为计算当前网格的最大礼物价值,需要知道其上方和左方网格的最大礼物价值,所以我们要初始化第一行和第一列的 dp 数组元素,防止越界情况的发生;
17+ //3. 状态转移方程:i>1 且 j>1 时:dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + grid[i][j]
18+ //
19+ //最后返回 dp[m-1][n-1] 即可。
20+
21+
22+ func maxValue (grid [][]int ) int {
23+ if len (grid )== 0 || len (grid [0 ])== 0 {
24+ return 0
25+ }
26+ m ,n := len (grid ),len (grid [0 ])
27+ dp := make ([][]int ,m )
28+ for i := 0 ;i < m ;i ++ {
29+ dp [i ] = make ([]int ,n )
30+ }
31+ dp [0 ][0 ] = grid [0 ][0 ]
32+ for i := 1 ;i < m ;i ++ {
33+ dp [i ][0 ] = grid [i ][0 ] + dp [i - 1 ][0 ]
34+ }
35+ for i := 1 ;i < n ;i ++ {
36+ dp [0 ][i ] = grid [0 ][i ] + dp [0 ][i - 1 ]
37+ }
38+ for i := 1 ;i < m ;i ++ {
39+ for j := 1 ;j < n ;j ++ {
40+ dp [i ][j ] = max (dp [i - 1 ][j ],dp [i ][j - 1 ]) + grid [i ][j ]
41+ }
42+ }
43+ return dp [m - 1 ][n - 1 ]
44+ }
45+
46+ func max (x ,y int ) int {
47+ if x > y {
48+ return x
49+ }
50+ return y
51+ }
Original file line number Diff line number Diff line change 1+ // 题目链接:https://leetcode.cn/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/?envType=study-plan&id=lcof
2+ package main
3+
4+ //简单的一维 dp 入门题目
5+ //动态规划三步:
6+ //1. 确定dp数组大小及下标含义:dp[i] 代表以下标 i 为最后元素的子数组的最大值,dp 数组长度与给定数组 nums 长度相同。
7+ //2. dp 数组初始化:每个单独元素都是一个子数组,初始化 dp[0] = nums[0]
8+ //3. 状态转移方程:从下标 1 开始,dp[i] = max(nums[i],nums[i]+dp[i-1]),若 dp[i-1]>0,说明以下标 i 截止的子数组的最大和要包含之前元素,包含多少呢?dp[i-1] 已经处理完了,我们只需要相加即可。
9+ // 最终需返回 dp 数组的最大值
10+ func maxSubArray (nums []int ) int {
11+ n := len (nums )
12+ dp := make ([]int ,n )
13+ dp [0 ] = nums [0 ]
14+ res := nums [0 ]
15+ for i := 1 ;i < n ;i ++ {
16+ dp [i ] = max (nums [i ],nums [i ]+ dp [i - 1 ])
17+ res = max (res ,dp [i ])
18+ }
19+ return res
20+ }
You can’t perform that action at this time.
0 commit comments