给定两个矩阵,分别代表两种矿石的分布情况,然后修铁路,每个位置可以有且只能有一个轨道,A矿石都被送到地图西(只能被向西的矿车开采),B矿石被运到地图北边(只能被向北的矿车开采),而且中途不停轨道不交叉,问最多能获得多少矿石。
对于一个点来言,如果取第一个矩阵的矿石,那么左边基本都是要开采A,同理取B,向上都是B类矿石
预处理前缀和...直接DP...
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[510][510],b[510][510];
int dp[510][510];
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
a[i][j]+=a[i][j-1];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&b[i][j]);
b[i][j]+=b[i-1][j];
}
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i][j-1]+b[i][j]);
}
}
printf("Case %d: %d\n",cas,dp[n][m]);
}
return 0;
}