tj
2025-09-21 20:17:47
发布于:福建
1阅读
0回复
0点赞
#include <bits/stdc++.h>
#define int long long
using namespace std;
/*
三方向路径d解法
*/
const long long N = 1e3 + 10;
long long n , m , a[N][N];
long long up[N];//up[i][j] 从下往上走到i,j途经数之和的max
long long down[N];
long long dp[N];
signed main( ) {
cin >> n >> m;
for (int i = 1 ; i <= n ; i++) {
for (int j = 1 ; j <= m ; j++) {
scanf("%lld" , & a[i][j]);
}
}
dp[1] = a[1][1];
for (int i = 2 ; i <= n ; i++) dp[i] = dp[i - 1] + a[i][1];
for (int j = 2 ; j < m ; j++) {
memset(up , 0 , sizeof up);
memset(down , 0 , sizeof down);
down[1] = dp[1] + a[1][j];
up[n] = dp[n] + a[n][j];
for (int i = 2 ; i <= n ; i++) down[i] = max(down[i - 1] , dp[i]) + a[i][j];
for (int i = n - 1 ; i >= 1 ; i--) up[i] = max(up[i + 1] , dp[i]) + a[i][j];
for (int i = 1 ; i <= n ; i++) dp[i] = max(up[i] , down[i]);
}
dp[1] += a[1][m];
for (int i = 2 ; i <= n ; i++) {
dp[i] = max(dp[i] , dp[i - 1]) + a[i][m];
}
cout << dp[n] << endl;
return 0;
}
这里空空如也
有帮助,赞一个