問題:m * nチェス盤の各正方形にギフトがあり、各ギフトには特定の値(0より大きい値)があります。ボードの左上隅から始めて、グリッド内のギフトを取得し、ボードの右下隅に到達するまで、一度に1マスずつ右または下に移動できます。チェス盤とその上の贈り物を考えて、あなたが得ることができる贈り物の最大値を計算してください?
def get_max_value(m_n):
rows = len(m_n)
cols = len(m_n[1])
# 注意这种初始化列表的方式
res = [[0 for i in range(cols)] for j in range(rows)]
i=0
while i<cols:
j= 0
while j<rows:
if i == 0 and j ==0:
arr = m_n[0][0]
elif i ==0 and j!=0:
arr = res[0][j-1]+m_n[0][j]
elif j ==0 and i != 0:
arr = res[i-1][0] + m_n[i][0]
else:
arr = max([res[i-1][j],res[i][j-1]]) + m_n[i][j]
res[i][j] = arr
j += 1
i += 1
return res
注:動的計画法の考え方を使用すると、状態方程式は次のようになります:f(i、j)= max(f(i-1、j)、f(i、j-1))+ values(i、j) 。それが最初の行にある場合、現在のグリッドまでの最大値は、前のグリッドの最大値+現在のグリッドの値です。最初の列にある場合、同じことが当てはまります。右下隅のグリッドの最大値は、この質問に必要な最大値です。