这题说的是给了 一个矩阵在每个单元内有BLOHHLUM 种的资源 Bi,j, 有YEYENUM 种的 资源Ai,j , 资 源 从 该 单 位 出 发 不能 转 弯 直 接 运 送 到 像 B 类 资 源 只 能 运送到 北部 不能转弯 相应的Y类资源也是一样的只能送到西部,有两种类型的传送带 南北方向和东西方向的南北方向只能运送B类 东西方向只能运送Y类,如下图
我们先假设 东西箭头为0状态 南北箭头为1 状态那么如果ij位置放0状态那么在第j列第i行后的必须为0状态要不就是0了 所以选0状态肯定是正确的,再由 i(j+1) 这个放哪个取最大值确定
当ij取 1 状态的时候也是一样的 转移
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
typedef long long ll;
const int maxn =;
ll value[][maxn][maxn];
ll row[maxn][maxn];
ll colum[maxn][maxn];
ll dp[][maxn][maxn];
void inti(int n, int m){
memset(dp,,sizeof(dp));
for(int i=; i<n; ++i)
for(int j=; j<m; ++j)
scanf("%lld",&value[][i][j]);
for(int i=; i<n; ++i)
for(int j=; j<m; ++j)
scanf("%lld",&value[][i][j]);
for(int i=; i<n; ++i){
row[i][m]=;
for(int j=m-; j>=; --j){
row[i][j]=row[i][j+]+value[][i][j];
}
}
for(int i=; i<m; ++i){
colum[n][i]=;
for(int j=n-; j>=; --j){
colum[j][i]=colum[j+][i]+value[][j][i];
}
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==&&n&&m){
inti(n,m);
for(int i=n-; i>=; --i){
for(int j=m-; j>=; --j){
dp[][i][j]=colum[i][j]+max(dp[][i][j+],dp[][i][j+]);
dp[][i][j]=row[i][j]+max(dp[][i+][j],dp[][i+][j]);
}
}
printf("%lld\n",max(dp[][][],dp[][][]));
}
return ;
}