清晰明了
2025-07-16 21:29:22
发布于:上海
9阅读
0回复
0点赞
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const long long INF = -1e18; // 更小的初始值
int n, m;
int a[1001][1001];
long long dp[1001][1001][3]; // 改用long long
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
dp[i][j][0] = dp[i][j][1] = dp[i][j][2] = INF;
}
}
// 初始化起点
dp[0][0][0] = dp[0][0][1] = dp[0][0][2] = a[0][0];
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
if (j > 0) {
long long max_prev = max(dp[i][j-1][0], max(dp[i][j-1][1], dp[i][j-1][2]));
if (max_prev != INF) {
dp[i][j][0] = max_prev + a[i][j];
}
}
if (i > 0) {
if (dp[i-1][j][1] != INF) {
dp[i][j][1] = max(dp[i][j][1], dp[i-1][j][1] + a[i][j]);
}
if (dp[i-1][j][0] != INF) {
dp[i][j][1] = max(dp[i][j][1], dp[i-1][j][0] + a[i][j]);
}
}
}
for (int i = n-2; i >= 0; i--) {
if (dp[i+1][j][2] != INF) {
dp[i][j][2] = max(dp[i][j][2], dp[i+1][j][2] + a[i][j]);
}
if (dp[i+1][j][0] != INF) {
dp[i][j][2] = max(dp[i][j][2], dp[i+1][j][0] + a[i][j]);
}
}
}
long long result = max(dp[n-1][m-1][0], max(dp[n-1][m-1][1], dp[n-1][m-1][2]));
cout << (result == INF ? -1 : result) << endl; // 处理不可达
return 0;
}
全部评论 1
制作不易,留个赞再走
2025-07-09 来自 上海
0
有帮助,赞一个