一个方格图,每个格子上有 A 矿与 B 矿。A 矿只能向西运输,B 矿只能向北运输。即如果要采某个格子上的矿,那么运输路上的这种矿要全采
转移很明显了
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])+s1[i][j];
f[i][j][1]=max(f[i][j-1][0],f[i][j-1][1])+s2[i][j];
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N=506; int n,m,f[N][N][2],s1[N][N],s2[N][N]; void solve(){ int i,j,x; memset(f,0,sizeof f); for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>x,s1[i][j]=s1[i][j-1]+x; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>x,s2[i][j]=s2[i-1][j]+x; for(i=1;i<=n;i++) for(j=1;j<=m;j++){ f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])+s1[i][j]; f[i][j][1]=max(f[i][j-1][0],f[i][j-1][1])+s2[i][j]; } cout<<max(f[n][m][0],f[n][m][1])<<'\n'; } signed main(){ while(cin>>n>>m,n) solve(); }