题意:
给定一个n*m的矩阵, 每个方格中有a矿和b矿, 要求a矿只能从左到右运输, b矿只能从上到下运输, 求最大的运输量
分析:
定义状态 :dp[i][j]:[1][1]到[n][m]中的最大运输量, dp[n][m]即为所求值
对于i,j位子若往上运输, 则j列的全部往上, 同理
dp[i][j] = max(dp[i-1][j] + tmp1, dp[i][j-1] + tmp2);
#include
#include
#include
using namespace std;
int dp[510][510], a[510][510], b[510][510];
int n, m;
int main() {
while(scanf("%d%d", &n, &m) == 2 && (n+m)) {
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &a[i][j]);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &b[i][j]);
memset(dp, 0, sizeof(dp));
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) {
int tmp1 = 0, tmp2 = 0;
for(int k=1; k<=j; k++)
tmp1 += a[i][k];
for(int k=1; k<=i; k++)
tmp2 += b[k][j];
dp[i][j] = max(dp[i-1][j]+tmp1, dp[i][j-1]+tmp2);
}
printf("%d\n", dp[n][m]);
}
return 0;
}