T1 42. 连续子数组的最大和
状态定义:
dp[i] 代表以元素nums[i]为结尾的连续子数组最大和
转移方程 :
dp[i] | 条件 |
---|---|
dp[i-1]+nums[i] | dp[i-1]>0 |
nums[i] | dp[i-1]<=0 |
class Solution {
public int maxSubArray(int[] nums) {
int res = nums[0];
for(int i=1;i<nums.length;i++){
nums[i] += Math.max(nums[i-1],0); //转移方程
res = Math.max(res,nums[i]); //最大值
}
return res;
}
}
T2 47. 礼物的最大价值
状态定义:
左上到右下
转移方程 :
dp[i] [j] | 条件 |
---|---|
grid[i] [j] | i=0,j=0 |
grid[i] [j] + grid[i-1] [j] | i=0,j≠0 第一行 只向右 |
grid[i] [j] + grid[i] [j-1] | i≠0,j=0 第一列 只向下 |
max(grid[i-1] [j],grid[i] [j-1])+grid[i] [j] | i≠0,j≠0 |
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length; //行数
int n = grid[0].length; //列数
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0 && j==0) continue;
if(i==0) grid[i][j] += grid[i][j-1];
else if(j==0) grid[i][j] +=grid[i-1][j];
else grid[i][j] +=Math.max(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
}