📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 77(1)

📅  最后修改于: 2023-12-03 15:23:03.415000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2013 |问题 77

题目描述

在一个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格式展示。