CSP-J 2020第四题 求大佬调试
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll maxn = 1e3;
const ll miin = -0x3f;
ll dx[4] = {0, 1, -1, 0};
ll dy[4] = {0, 0, 0, 1};
ll n, m, ans = -1e4;
ll a[maxn][maxn], dp[maxn][maxn][4];
void dfs(ll x, ll y, ll cur) {
if (x == n && y == m) {
if (cur > ans) ans = cur;
return;
}
for (ll i = 1; i <= 3; i++) {
ll nx = x + dx[i];
ll ny = y + dy[i];
if (nx < 1 || ny < 1 || nx > n || ny > m) break;
if (dp[nx][ny][i] == -4485090715960753727) {
dfs(nx, ny, cur + a[nx][ny]);
dp[x][y][i] = max(max(dp[nx][ny][1], dp[nx][ny][2]), dp[nx][ny][3]);
} else {
ll p = max(max(dp[nx][ny][1], dp[nx][ny][2]), dp[nx][ny][3]);
if (cur + p > ans) ans = cur + p;
}
}
}
int main() {
cin >> n >> m;
for (ll i = 1; i <= n; i++)
for (ll j = 1; j <= m; j++)
cin >> a[i][j];
memset(dp, miin, sizeof(dp));
for(ll i=1;i<=n;i++) dp[1][i][2]=0;
for(ll i=1;i<=m;i++) dp[i][1][3]=0;
dp[n][m][1] = dp[n][m][3] = a[n][m];
dfs(1, 1, a[1][1]);
cout << ans;
return 0;
}