📅  最后修改于: 2023-12-03 15:23:03.415000             🧑  作者: Mango
在一个N * N 的矩阵中,从某个起点出发,只能上下左右四个方向行走,每个格子有一个权值,走过一个格子可以获得相应的权值,请你找出一条路径,使得路径上的权值之和最大。
第一行包含一个整数N,表示矩阵的大小。 接下来N行,每行包含N个整数,表示每个格子的权值。
输出一行,包含一个整数,表示从起点走到终点所能获得的最大权值之和。
4
1 2 3 4
2 3 4 5
4 5 6 7
5 6 7 8
30
本题可以使用动态规划来解决。从起点开始,到每个点的最大权值,则可以通过其上、下、左、右四个格子中的最大值加上当前格子的权值得出。设矩阵dp[i][j]表示到达格子(i, j)时可以获得的最大权值,则状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i+1][j], dp[i][j-1], dp[i][j+1]) + array[i][j]
n = int(input())
matrix = []
for i in range(n):
row = list(map(int, input().split()))
matrix.append(row)
dp = [[0] * n for i in range(n)]
dp[0][0] = matrix[0][0]
# 初始化第一列
for i in range(1, n):
dp[i][0] = dp[i-1][0] + matrix[i][0]
# 初始化第一行
for j in range(1, n):
dp[0][j] = dp[0][j-1] + matrix[0][j]
# 动态规划求解
for i in range(1, n):
for j in range(1, n):
dp[i][j] = max(dp[i-1][j], dp[i+1][j], dp[i][j-1], dp[i][j+1]) + matrix[i][j]
print(dp[n-1][n-1])
注: 以上代码片段以markdown格式展示。