chason95

由于涉及最值,应该用dp做。(像dfs也像dp的题应该两个都可以做,但是由于用dfs遍历所有可能再求最值时间复杂度会很高等价于暴力解法,所以还是dp好)

又是一个牛客网上没有的题。

由于礼物价值正整数,所以相对好做:

使用dp[][]存储以(i,j)位置结束可以拿到的最大礼物价值。

首先初始化dp[0][j]和dp[i][0]。

dp[0][j]=dp[0][j-1]+a[0][j],dp[i][0]类似。

然后dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j]。

哦了

class Solution(object):
    def maxValue(self,values):
        m = len(values)
        n = len(values[0])
        dp = [[0 for i in range(n)] for j in range(m)]
        dp[0][0]=values[0][0]
        for i in range(1,n):
            dp[0][i]=dp[0][i-1]+values[0][i]
        for i in range(1,m):
            dp[i][0]=dp[i-1][0]+values[i][0]
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j]=max(dp[i-1][j],dp[i][j-1])+values[i][j]
        return dp[m-1][n-1]

if __name__==\'__main__\':
    sol = Solution()
    values = [[1,10,3,8],
              [12,2,9,6],
              [5,7,4,11],
              [3,7,16,5]]
    print sol.maxValue(values)

 

分类:

技术点:

相关文章: