題目描述
在一個m×n的棋盤的每一格都放有一個禮物,每個禮物都有一定的價值(價值大於0)。
你可以從棋盤的左上角開始拿格子裏的禮物,並每次向右或者向下移動一格直到到達棋盤的右下角。
給定一個棋盤及其上面的禮物,請計算你最多能拿到多少價值的禮物?
思路
從左上角(0,0)走到右下角(m-1,n-1),每次只能向下或向右移動一格,選擇價值最大的一條路徑,很明顯這是一道動態規劃題。
遞推式:dp[i][j]= max (dp[i-1][j], dp[i][j-1])+ a[i][j]
參考代碼
def maxValue(array):
m = len(array)
n = len(array[0])
dp =[[0] * n for i in range(m)]
dp[0][0] = array[0][0]
for i in range(1, m):
dp[i][0] = dp[i - 1][0] + array[i][0]
for i in range(1, n):
dp[0][i] = dp[0][i - 1] + array[0][i]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + array[i][j]
return dp[m - 1][n - 1]
空間複雜度是O(m*n),還可優化。