zoukankan      html  css  js  c++  java
  • 洛谷P2380 狗哥采矿

    P2380 狗哥采矿

    题目背景

    又是一节平静的语文课

    狗哥闲来无事,出来了这么一道题

    题目描述

    一个n*m的矩阵中,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少。最北边有bloggium的收集站,最西边有 yeyenum 的收集站。现在要你在这些格子上面安装向北或者向西的传送带(每个格子只能装一种)。问最多能采到多少矿?

    输入输出格式

    输入格式:

    第一行包含两个整数n,m,( 1 ≤ n ≤ 500, 1 ≤ m ≤ 500)。接下来n行m列,表示每个格子中可以传送到yeyenum的数量(小于1000),再接下来n行m列,表示每个格子中可以传送到bloggium的数量。n, m 同时为0结束。

    输出格式:

    每组测试数据仅输出一个数,表示最多能采到的矿。

    输入输出样例

    输入样例#1:
    4 4
    0 0 10 9 
    1 3 10 0
    4 2 1 3 
    1 1 20 0 
    10 0 0 0 
    1 1 1 30 
    0 0 5 5 
    5 10 10 10 
    0 0
    输出样例#1:
    98

    说明

    传输过程中不能转弯,只能走直路。

    /*
        我们定义f[i][j]f[i][j]为在以(i,j)(i,j)为右下角的子矩阵中的最大采矿量,由题意我们可知,如果(i,j)(i,j)是向左转移矿,那么(i,j-1)(i,j?1),一定也是向左,(i,j-2)(i,j?2)一直到(i,1)(i,1)都是向左,同理如果(i,j)(i,j)是向上转移矿,那么(i-1,j)(i?1,j),一定也是向上,(i-2,j)(i?2,j)一直到(1,j)(1,j)都是向左。这就可以其实我们用前缀和去维护一段区间的采矿量。
        在转移时,我们只关心当前(i,j)(i,j)的采矿方向。设A[i][j]A[i][j]为向上的前缀和,B[i][j]B[i][j]为向左的前缀和,那么转移方程f[i][j]=max(f[i-1][j]+B[i][j],f[[i][j-1]+A[i][j])f[i][j]=max(f[i?1][j]+B[i][j],f[[i][j?1]+A[i][j]).
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define maxn 510
    int n,m,a[maxn][maxn],b[maxn][maxn],f[maxn][maxn],ans;
    int main(){
        while(1){
            scanf("%d%d",&n,&m);
            if(n==0&&m==0)return 0;
            memset(f,0,sizeof(f));
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            ans=0;
            int x;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++){
                    scanf("%d",&x);
                    a[i][j]=a[i][j-1]+x;
                }
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++){
                    scanf("%d",&x);
                    b[i][j]=b[i-1][j]+x;
                }
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++){
                    f[i][j]=max(f[i-1][j]+a[i][j],f[i][j-1]+b[i][j]);
                    ans=max(f[i][j],ans);
                }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    Java学习笔记(二十三):final关键字
    Java学习笔记(二十二):打包程序
    Java框架spring Boot学习笔记(一):开始第一个项目
    Java学习笔记(二十一):类型转换和instanceof关键字
    Java学习笔记(二十):多态
    Java学习笔记(十二):java编译跨平台运行原理
    java学习笔记(十一):重写(Override)与重载(Overload)
    java学习笔记(十):scanner输入
    java学习笔记(九):Java 流(Stream)、文件(File)和IO
    java学习笔记(八):继承、extends、super、this、final关键字
  • 原文地址:https://www.cnblogs.com/thmyl/p/7608120.html
Copyright © 2011-2022 走看看