题目来源:1015. 摘花生 - AcWing题库
题目描述:
Hello Kitty想摘点花生送给她喜欢的米老鼠。
她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。
地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。
Hello Kitty只能向东或向南走,不能向西或向北走。
问Hello Kitty最多能够摘到多少颗花生。
很显然,用暴力方法穷举一定会超时,这是一道经典的DP问题
DP数组定义:
dp[i][j]:老鼠走到 花生地 w[i][j]时摘到的花生数,
很显然,需要初始化DP数组dp[0][0]=w[0][0]
同时,在第一行,或第一列,他的状态只能由上一行或上一列变换过来
dp[i][j]=dp[i-1][j]+w[i][j] if j==0
dp[i][j]=dp[i][j-1]+w[i][j] if i==0
一般情况 不是来自该点的左一格位置就是上一格
dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1] )+res[i][j]
完整程序
n = int(input())
for i in range(n):
l, w = map(int, input().split())
dp = [[0 for _ in range(w)] for _ in range(l)]
res = []
for i in range(l):
res.append([int(x) for x in input().split()])
for i in range(l):
for j in range(w):
if i == 0 and j == 0:
dp[i][j] = res[i][j]
elif i == 0 and j > 0:
dp[i][j] = dp[i][j - 1] + res[i][j]
elif i > 0 and j == 0:
dp[i][j] = dp[i - 1][j] + res[i][j]
else:
dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1] )+res[i][j]
print(dp[l - 1][w - 1])