剑指offer计划9(动态规划中等版)---java
1.1、题目1
剑指 Offer 42. 连续子数组的最大和
1.2、解法
得到转移方程后,单次遍历。
当前面的连续子数组的和比较是否大于0,是则加起来,
若小于零,则当前的值就可当子数组的开头。
判断每次的大小则取出最大值。
1.3、代码
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(nums[i],res);
}
return res;
}
}
2.1、题目2
剑指 Offer 47. 礼物的最大价值
2.2、解法
这里礼物的最大价值,分情况讨论。
当当前坐标在第一层时,它之前只可能是一直向右移动,
当当前坐标在第一列时,它之前只可能是一直向下移动,
其他情况下,则比较该位置的上一层值与该位置左一列的值进行比较,
谁比较大,则加当前的值,成为当前位置的值。
2.3、代码
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length, 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][j - 1], grid[i - 1][j]);
}
}
return grid[m - 1][n - 1];
}
}