zoukankan      html  css  js  c++  java
  • 1360 xth 的玫瑰花

    1360 xth 的玫瑰花

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

    这天是rabbit 的生日前夕,Xth 来到花店,要给他的rabbit 买玫瑰花,为了保证质
    量,他跟花店老板——小菜儿同学要求自己到花田采摘。小菜儿灰常希望早日见到
    暖熊(xth 儿子的小名),于是他决定帮忙。
    小菜儿告诉xth,花田是一个n ∗ m的矩形区域,里面有红玫瑰和黑玫瑰两种玫瑰。
    Xth 探明了每一块小区域内红玫瑰和黑玫瑰的种植量,并且还在花田的北边和西边
    分别设置了红玫瑰和黑玫瑰的收集站(地图上上北下南左西右东)。你的任务是设
    计一个运输线系统,使得运送的红玫瑰和黑玫瑰的总量最多。
    运输线有两种,一种是东西向,一种是南北向。在一个格子内你能建造一种运输线,
    但不能两种都建。如果两个同类型运输线首尾相接,它们就可以被连接起来。
    另外,这些玫瑰都十分不稳定,因此它们在运送过程中都不能拐弯。这就意味着如
    果某个格子上建有南北向运输线,但是它北边的格子建有东西向运输线。那么这条
    南北向运输线内运送的任何东西都将丢失。进一步地,运到红玫瑰收集点的黑玫瑰
    会丢失,运到黑玫瑰收集点的红玫瑰也会丢失。

    输入描述 Input Description

    第一行包含两个整数n和m,表示花田大小。 以下n行,每行m个整数,其中第i行
    第j个整数g[ i ,j ] 描述各个格子上的黑玫瑰数量。接下来以类似的矩阵表示各个格
    子上的红玫瑰数量。

    输出描述 Output Description

    仅一个整数, 表示最多可以采集到的红玫瑰和黑玫瑰的总量。

    样例输入 Sample Input

    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

    样例输出 Sample Output

    98

    数据范围及提示 Data Size & Hint

    对于30%的数据: 0 ≤ n, m ≤ 100;
    对于100%的数据: 0 ≤ n,m ≤ 1000;
    0 ≤ g[ i,j ] ≤ 1000.

    分类标签 Tags 点此展开 

     
    题解:
    由题意可知,对于每一个点(i,j)只能往上走 或 往左走
    所以就可以搞了。
    R[i][j]表示第j列前i行的红玫瑰数量之和
    B[i][j]表示第i行前j列的黑玫瑰数量之和
    (求其他前缀和没有意义)
    f[i][j]表示(1,1)->(i,j)这个矩形中的红玫瑰数量+黑玫瑰数量的最大值
    自行初始化。
    转移方程:
    f[i][j]=max(f[i-1][j]+B[i][j],f[i][j-1]+R[i][j]);

    ans:f[n][m]
    时间复杂度:O(n*m)
    AC代码:
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=1003;
    inline const int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int B[N][N],R[N][N],f[N][N];
    int main(){
        int n=read(),m=read();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                B[i][j]=read(),B[i][j]+=B[i][j-1];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                R[i][j]=read(),R[i][j]+=R[i-1][j];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                f[i][j]=max(f[i-1][j]+B[i][j],f[i][j-1]+R[i][j]);
            }
        }
        printf("%d
    ",f[n][m]);
        return 0;
    }
     
  • 相关阅读:
    75. 颜色分类
    排序链表
    两个数组的交集
    242. 有效的字母异位词
    排序优化
    622.设计循环队列
    比较含退格的字符串
    682.棒球比赛
    496.下一个更大的元素I
    线性排序算法
  • 原文地址:https://www.cnblogs.com/shenben/p/5922827.html
Copyright © 2011-2022 走看看