Leetcode_64 & 剑指offer 47

题目描述

在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘

1    10   3    8
12   2    9    6
5    7    4    11
3    7    16   5

礼物的最大价值为 1+12+5+7+7+16+5=53。

解题思路

应该用动态规划求解,而不是深度优先搜索,深度优先搜索过于复杂,不是最优解。

java

public int getMost(int[][] values)
{
    if (values == null || values.length == 0 || values[0].length == 0)
        return 0;
    int n = values[0].length;
    int[] dp = new int[n];
    for (int[] value : values) {
        dp[0] += value[0];
        for (int i = 1; i < n; i++)
            dp[i] = Math.max(dp[i], dp[i - 1]) + value[i];
    }
    return dp[n - 1];
}

python

import copy
class Solution:
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        temp = copy.deepcopy(grid)
        for i in range(1,len(temp[0])):
            temp[0][i] = temp[0][i]+temp[0][i-1]

        for i in range(1,len(grid)):
            temp[i][0] = temp[i][0]+ temp[i-1][0]
            for j in range(1,len(grid[i])):
                temp[i][j] = min(temp[i][j-1],temp[i-1][j])+temp[i][j]

        return temp[-1][-1]


if __name__ == '__main__':
    gird = [[1,3,1],[1,5,1],[4,2,1]]
    a = Solution()
    print(a.minPathSum(gird))

猜你喜欢

转载自blog.csdn.net/ding_xiaofei/article/details/81172970
今日推荐