剑指 Offer 47. 礼物的最大价值

剑指 Offer 47. 礼物的最大价值

这里有一个好处在于所有值都是正的,所以处理起来不用像子数组一样处理和为负要重新选择,但是这里也是比较简单的。
可以用dp[i][j]记录我们走到[i][j]位置时所能获得的礼物最大价值,那么很显然,我们到达[i][j]位置有2种方式,从[i-1][j]即从上往下或是从[i][j-1]即从左往右到达,那么我们选择这两种方式到达的最大价值的那条,故而dp[i][j] = grid[i][j] + Math.max(dp[i - 1][j], dp[i][j - 1])。同时一直维护ans即可。

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length;
        if(m == 0) return 0;
        int n = grid[0].length;
        int[][] dp = new int[m][n];
        dp[0][0] = grid[0][0];
        int ans = dp[0][0];
        for(int i = 1; i < n; i++) {
            dp[0][i] = dp[0][i - 1] + grid[0][i];
            ans = Math.max(dp[0][i], ans);
        }
        for(int i = 1; i < m; i++) {
            dp[i][0] = dp[i - 1][0] + grid[i][0];
            ans = Math.max(dp[i][0], ans);
        }
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                int currentVal = grid[i][j];
                int preVal = Math.max(dp[i - 1][j], dp[i][j - 1]);
                dp[i][j] = currentVal + preVal;
            }
        }
        return dp[m - 1][n - 1];
    }
}
posted @ 2022-01-24 00:07  NullPointer_C  阅读(39)  评论(0)    收藏  举报