帮忙解答2-3个问题就给关。
我觉得不一定一列都是一个方向啊,可能dp[1][j]到dp[i][j]是往下走,而dp[i+1][j]到dp[n][j]是向上走 这样也不会重复。(其他问在代码注释中)
#include<bits/stdc++.h>
using namespace std;
long long a[1010][1010],dp[1010],s[1010],x[1010],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>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 i=2;i<m;i++){
x[1]=dp[1]+a[1][i];
s[n]=dp[n]+a[n][i];
for(int j=2;j<=n;j++)
x[j]=max(dp[j],x[j-1])+a[j][i];
for(int j=n-1;j>=1;j--)
s[j]=max(dp[j],s[j+1])+a[j][i];
for(int j=1;j<=n;j++)
dp[j]=max(x[j],s[j]);
}
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];
return 0;
}