题目
输入输出
讲解
这题,是四维动规的模板题,我们考虑两个人同时走,就相当于数字三角形。状态转移方程为:
f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l];
不过要判断i=k&&j=l的情况。
完整代码如下:
代码
num = int(input())
qt = []
a, b, c = 1, 1, 1
while a or b or c:
a, b, c = map(int, input().split())
d = [a, b, c]
qt.append(d)
wz = [[0 for i in range(num+1)]for j in range(num+1)]
sd = [[[[0for i in range(12)]for j in range(12)]for k in range(12)]for l in range(12)]
for i in qt:
wz[i[0]][i[1]] = i[2]
for i in range(1, num+1):
for j in range(1, num+1):
for k in range(1, num+1):
for l in range(1, num+1):
sd[i][j][k][l] = max(sd[i-1][j][k-1][l], sd[i][j-1][k-1][l], sd[i][j-1][k][l-1], sd[i-1][j][k][l-1])+wz[i][j]+wz[k][l]
if i == k and j == l:
sd[i][j][k][l] -= wz[i][j]
print(sd[num][num][num][num])