zoukankan      html  css  js  c++  java
  • bzoj1177 [Apio2009]Oil 二维前缀最大值,和

    [Apio2009]Oil

    Time Limit: 15 Sec  Memory Limit: 162 MB
    Submit: 2300  Solved: 932
    [Submit][Status][Discuss]

    Description

    采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。 为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方形区域。 AoE石油联合公司由三个承包商组成,他们想选择三块互不相交的K×K的区域使得总的收益最大。 例如,假设石油储量的估计值如下: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 8 8 8 8 8 1 1 1 1 8 8 8 8 8 1 1 1 1 8 8 8 8 8 1 1 1 1 1 1 1 8 8 8 1 1 1 1 1 1 1 1 8 8 8 1 1 1 1 1 1 9 9 9 1 1 1 1 1 1 9 9 9 如果K = 2, AoE公司可以承包的区域的石油储量总和为100, 如果K = 3, AoE公司可以承包的区域的石油储量总和为208。 AoE公司雇佣你来写一个程序,帮助计算出他们可以承包的区域的石油储量之和的最大值。

    Input

    输入第一行包含三个整数M, N, K,其中M和N是矩形区域的行数和列数,K是每一个承包商承包的正方形的大小(边长的块数)。接下来M行,每行有N个非负整数表示这一行每一小块土地的石油储量的估计值

    Output

    输出只包含一个整数,表示AoE公司可以承包的区域的石油储量之和的最大值。

    Sample Input

    9 9 3
    1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1
    1 8 8 8 8 8 1 1 1
    1 8 8 8 8 8 1 1 1
    1 8 8 8 8 8 1 1 1
    1 1 1 1 8 8 8 1 1
    1 1 1 1 1 1 8 8 8
    1 1 1 1 1 1 9 9 9
    1 1 1 1 1 1 9 9 9

    Sample Output

    208

    HINT

     
    对于复杂度的,话,是n^2的吧,数据范围因为时间复杂度和输入范围一样,所以可以过。
     
     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #define inf 100000000000000LL
     7 #define pa pair<int,int>
     8 #define ll long long 
     9 #define N 2505
    10 #define fp(a,b,c) for(int a=b;a<=c;a++)
    11 #define fd(a,b,c) for(int a=c;a>=b;a--)
    12 using namespace std;
    13 int n,m,K,ans;
    14 int a[N][N],b[N][N],c[N][N],d[N][N],s[N][N];
    15 int main()
    16 {
    17     scanf("%d%d%d",&n,&m,&K);
    18     fp(i,1,n)fp(j,1,m)
    19     {
    20         int x;scanf("%d",&x);
    21         s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+x;
    22     }
    23     fd(i,K,n)fd(j,K,m)s[i][j]-=s[i-K][j]+s[i][j-K]-s[i-K][j-K];//s[i][j]表示以i,j为右下角的的k*k的正方形的价值 
    24 
    25     fp(i,K,n)fp(j,K,m)a[i][j]=max(s[i][j],max(a[i-1][j],a[i][j-1]));//a[i][j]表示以i,j为右下角的最大值
    26     fp(i,K,n)fd(j,K,m)b[i][j]=max(s[i][j],max(b[i-1][j],b[i][j+1]));//b[i][j]表示以i,j为左下角的最大值 
    27     fd(i,K,n)fp(j,K,m)c[i][j]=max(s[i][j],max(c[i+1][j],c[i][j-1]));//c[i][j]表示以i,j为右上角的最大值 
    28     fd(i,K,n)fd(j,K,m)d[i][j]=max(s[i][j],max(d[i+1][j],d[i][j+1]));//d[i][j]表示以i,j为左上角的最大值 
    29 
    30     fp(i,K,n-K)fp(j,K,m-K)ans=max(ans,a[i][j]+b[i][j+K]+c[i+K][m]);
    31     fp(i,K,n-K)fp(j,K+K,m)ans=max(ans,b[i][j]+d[i+K][j]+a[n][j-K]);
    32     fp(i,K+K,n)fp(j,K,m-K)ans=max(ans,c[i][j]+d[i][j+K]+a[i-K][m]);
    33     fp(i,K,n-K)fp(j,K,m-K)ans=max(ans,a[i][j]+c[i+K][j]+b[n][j+K]);
    34 
    35     fp(i,K,n)fp(j,K+K,m-K)ans=max(ans,s[i][j]+a[n][j-K]+b[n][j+K]);
    36     fp(i,K+K,n-K)fp(j,K,m)ans=max(ans,s[i][j]+a[i-K][m]+c[i+K][m]);
    37 
    38     printf("%d
    ",ans);
    39 }
  • 相关阅读:
    关于js继承学习系列之一:开篇有益[转]
    关于js继承学习系列之五:其他方式及总结[转]
    NPOI 单元格格式集合
    js的排序方法集合
    关于js继承学习系列之四:组合继承(Combination Inheritance)[转]
    关于js继承学习系列之二:原型链(Prototype Chaining)[转]
    JS的函数重载
    转发与重定向的区别(jekyll迁移)
    解决ajax异步更新后控件的click事件失效的方法(jekyll迁移)
    jdk11源码Integer.numberOfLeadingZeros(int i)(jekyll迁移)
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8760295.html
Copyright © 2011-2022 走看看