在一个n×m的方格中,m为奇数,方置n×m个数方格中间的下方有一个人,此人可按照五个方向前进但不能逃出方格,人每走过一个方格必需取此方格中的数。要求找到一条从底到顶的路径,侠其数相加之和为最大。用c++编写程序,并输出最大值
时间: 2024-10-22 14:15:04 浏览: 37
poj 2893 M × N Puzzle.md
这是一个经典的动态规划问题,可以用递推的方式来求解。我们需要遍历每个位置并计算当前位置加上左、右、上、下四个相邻位置的最大值。由于是向下走并且不允许离开矩阵,所以不需要考虑上方的位置。以下是C++代码实现:
```cpp
#include <vector>
#include <climits>
int maxPathSum(vector<vector<int>>& grid) {
int m = grid.size();
if (m == 0) return 0;
int n = grid[0].size();
vector<vector<int>> dp(m, vector<int>(n));
dp[0][m/2] = grid[0][m/2]; // 初始化中间行的第一个元素
for (int i = 1; i < m; ++i) { // 从第二行开始
for (int j = 0; j < n; ++j) { // 遍历每一列
if (j > 0) dp[i][j] = max(dp[i][j], dp[i-1][j-1] + grid[i][j]); // 右侧相邻
if (j < n-1) dp[i][j] = max(dp[i][j], dp[i-1][j+1] + grid[i][j]); // 左侧相邻
dp[i][j] = max(dp[i][j], dp[i-1][j]); // 上方相邻
}
}
return dp[m-1][0]; // 返回最后一行最后一个元素作为结果
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> grid(n, vector<int>(m));
// 读入网格中的数字
for (auto& row : grid)
for (auto& num : row)
cin >> num;
int result = maxPathSum(grid);
cout << "The maximum sum path from bottom to top is: " << result << endl;
return 0;
}
```
这个程序首先初始化中间行的值,然后通过四向扩散更新每个位置的最大和,最终返回底部到顶部的路径和。
阅读全文