p7074 方格取数
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long//十年oi一场空,不开 longlong见祖宗
using namespace std;
ll f[100010][100010][5];//设f[i][j][1]表示从上面走过来,f[i][j][2]表示从左面走过来,设f[i][j][3]表示从下面走过来
ll a[100010][100010];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=2;i<=n;i++){
f[0][i][4]=f[0][i-1][4]+a[0][i];//f数组必须要赋初值
}
for(int i=2;i<=n;i++){
f[i][1][1]=f[i-1][1][1]+a[i][1];//由于第一列只能从上面转移过来,所以提前初始化
}
for(int i=2;i<=m;i++){
for(int j=1;j<=n;j++){
f[i][j][2]=max(f[i][j][2],max(f[i][j-1][1],max(f[i][j-1][2],f[i][j-1][3]))+a[i][j]);//从左边走过来的话上一步怎么走都可以
}
for(int j=2;j<=n;j++){
f[i][j][1]=max(f[i][j][1],max(f[i-1][j][2],f[i-1][j][1])+a[i][j]);//从上面走过来的话不能上一步从下面走过来,不然就重复了
}
for(int j=n-1;j>=1;j--){
f[i][j][3]=max(f[i][j][3],max(f[i+1][j][2],f[i+1][j][3])+a[i][j]);//从下面走过来原因同上
}
}
cout<<max(f[n][m][1],f[n][m][2]);//最后答案只可能从左面或上面走过来
return 0;
}
运行时错误,求调!