问题
https://vjudge.net/problem/UVA-1366
分析
递推DP,dp[i][j]表示右下角坐标[i,j]的矩形能够运出最多的矿物是多少
状态转移: dp[i][j]=max(dp[i][j-1]+B[j][i],dp[i-1][j]+A[i][j]);
B[j][i]表示从[i][j]向上运输一条线上一共能够输出的B中矿物
A[i][j]是从[i][j]从右向左运输运出的A类矿物
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=500+5;
int n,m,grapha[maxn][maxn],graphb[maxn][maxn],suma[maxn][maxn],sumb[maxn][maxn],dp[maxn][maxn];
int main(void){
while(scanf("%d%d",&n,&m)==2 && n){
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%d",&grapha[i][j]);
suma[i][j]=suma[i][j-1]+grapha[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%d",&graphb[i][j]);
sumb[i][j]=sumb[i-1][j]+graphb[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
dp[i][j]=max(dp[i-1][j]+suma[i][j],dp[i][j-1]+sumb[i][j]);
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}