uva1366 dp

这题说的是给了 一个矩阵在每个单元内有BLOHHLUM 种的资源 Bi,j, 有YEYENUM 种的 资源Ai,j , 资 源 从 该 单 位 出 发 不能 转 弯 直 接 运 送 到 像 B 类 资 源 只 能 运送到 北部 不能转弯 相应的Y类资源也是一样的只能送到西部,有两种类型的传送带 南北方向和东西方向的南北方向只能运送B类 东西方向只能运送Y类,如下图

epsfbox{p3530.eps}

我们先假设 东西箭头为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
",max(dp[0][0][0],dp[1][0][0]));
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Opaser/p/4065792.html