感觉自己的代码跟题解没什么区别啊qwq
// I love CCF!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n = 0, m = 0; cin >> n >> m;
int a[n + 10][m + 10];
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
long long dp[n + 10][m + 10][3]; //dp[i][j][0]代表从上面到a[i][j]的最大值, dp[i][j][1]代表从下面到a[i][j]的最大值, dp[i][j][2]代表从左边到a[i][j]的最大值
memset(dp, 128, sizeof(dp));
dp[1][1][0] = a[1][1]; dp[1][1][1] = a[1][1]; dp[1][1][2] = a[1][1];
int i = 1, j = 1;
for (i = 1; i <= n; i++)
{
dp[i][j][2] = a[i][j];
dp[i][j][1] = a[i][j];
if (i == 1) continue;
dp[i][j][0] = dp[i - 1][j][0] + a[i][j];
}
for (j = 2; j <= m; j++)
{
for (i = 1; i <= n; i++)
{
dp[i][j][2] = max(max(dp[i][j - 1][0], dp[i][j - 1][1]), dp[i][j - 1][2]) + a[i][j];
if (i == 1) continue;
else dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][2]) + a[i][j];
}
for (i = n; i >= 0; i--)
{
if (i == n) continue;
else dp[i][j][1] = max(dp[i + 1][j][1], dp[i + 1][j][2]) + a[i][j];
}
}
cout << max(dp[n][m][0], dp[n][m][2]) << endl;
return 0;
}