剑指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];
    }
}


posted @ 2021-09-09 09:45  程序员khaos  阅读(51)  评论(0编辑  收藏  举报