我的代码(20分):
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1005;
int a[N][N],f[2][N],ans[N];
signed main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>a[i][j];
for(int i=1;i<=n;++i)
ans[i]=ans[i-1]+a[i][1];
for(int j=2;j<=m;++j)
{
f[0][1]=ans[1]+a[1][j],
f[1][n]=ans[1]+a[n][j];
for(int i=2;i<=n;++i)
f[0][i]=max(ans[i],f[0][i-1])+a[i][j];
for(int i=n-1;i>=1;--i)
f[1][i]=max(ans[i],f[1][i+1])+a[i][j];
for(int i=1;i<=n;++i)
ans[i]=max(f[0][i],f[1][i]);
}
cout<<ans[n];
return 0;
}
老师的:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1005;
ll f[N][N];
ll a[N][N];
ll up[N],down[N];//从上面过来和从下面过来
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
f[i][1]=f[i-1][1]+a[i][1];
for(int j=2;j<=m;j++)
{
for(int i=1;i<=n;i++)
{
up[i]=f[i][j-1]+a[i][j];
if(i>1)
up[i]=max(up[i],up[i-1]+a[i][j]);
}
for(int i=n;i>=1;i--)
{
down[i]=f[i][j-1]+a[i][j];
if(i<n)
down[i]=max(down[i],down[i+1]+a[i][j]);
}
for(int i=1;i<=n;i++)
f[i][j]=max(up[i],down[i]);
}
cout<<f[n][m];
return 0;
}