Day09_剑指Offer

Day09_剑指Offer

package com.sorrymaker.day3309;

import org.junit.Test;

/**
 * 连续子数组的最大和
 * @Author nextGame
 * @Date 2021/8/21 20:52
 * @Version 1.0
 */
public class MaxSubArray {

    @Test
    public void test(){
        int[] nums ={-2,1,-3,4,-1,2,1,-5,4};
        System.out.println(maxSubArray(nums));
    }

    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;
    }
}

package com.sorrymaker.day3309;

/**在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。
 * 你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、
 * 直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
 * @Author nextGame
 * @Date 2021/8/21 21:29
 * @Version 1.0
 */
public class MaxValue {

    public int maxValue(int[][] grid) {
        //定义行 、 列
        int row = grid.length;
        int column = grid[0].length;
        //定义dp数组,比grid多一列和一行。
        int[][] dp = new int[row + 1][column + 1];

        //嵌套循环
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= column; j++) {
                //求出dp里面最大值的地方,再加上grid 原本的右下角的值 。 就是总共的价值。
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }
        //i 和 j 是局部变量,因为i和j都是遍历到row和column结束,所以返回dp[row][column] == dp[i][j]
        return dp[row][column];
    }
}
posted @ 2021-08-22 23:21  独眼龙  阅读(17)  评论(0)    收藏  举报