标签:style blog http io color os ar for sp
这题说的是给了 一个矩阵在每个单元内有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 =505; ll value[2][maxn][maxn]; ll row[maxn][maxn]; ll colum[maxn][maxn]; ll dp[2][maxn][maxn]; void inti(int n, int m){ memset(dp,0,sizeof(dp)); for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) scanf("%lld",&value[0][i][j]); for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) scanf("%lld",&value[1][i][j]); for(int i=0; i<n; ++i){ row[i][m]=0; for(int j=m-1; j>=0; --j){ row[i][j]=row[i][j+1]+value[1][i][j]; } } for(int i=0; i<m; ++i){ colum[n][i]=0; for(int j=n-1; j>=0; --j){ colum[j][i]=colum[j+1][i]+value[0][j][i]; } } } int main() { int n,m; while(scanf("%d%d",&n,&m)==2&&n&&m){ inti(n,m); for(int i=n-1; i>=0; --i){ for(int j=m-1; j>=0; --j){ dp[0][i][j]=colum[i][j]+max(dp[0][i][j+1],dp[1][i][j+1]); dp[1][i][j]=row[i][j]+max(dp[0][i+1][j],dp[1][i+1][j]); } } printf("%lld\n",max(dp[0][0][0],dp[1][0][0])); } return 0; }
标签:style blog http io color os ar for sp
原文地址:http://www.cnblogs.com/Opaser/p/4065792.html