洛谷P3625 - [APIO2009]采油区域

Portal

Description

给出一个\(n\times m(n,m\leq1500)\)的矩阵,从中选出\(3\)个互不相交的\(k\times k\)方阵,使得被选出的数的和最大。

Solution

奇怪做法...

三个矩形分别在三个部分中,把矩形划分成三部分只有这六种。首先搞出\(s[i][j]\)表示以\((i,j)\)为右下角的\(k\times k\)方阵的和,然后搞出\(f_1[i][j]\)表示\((1,1)-(i,j)\)中\(s\)的最大值,\(f_2[i][j]\)表示\((1,m)-(i,j)\)中\(s\)的最大值,\(f_3[i][j]\)表示\((n,m)-(i,j)\)中\(s\)的最大值,\(f_4[i][j]\)表示\((n,1)-(i,j)\)中\(s\)的最大值。枚举横竖划分在哪就可以解决四种。
平行的那两种搞出行/列最大值然后瞎搞即可。

时间复杂度\(O(nm)\)。

Code

//[APIO2009]Oil
#include <cstdio>
const int N=2000;
inline int max(int x,int y) {return x>y?x:y;}
int n,m,k,a[N][N];
int pre[N][N],s[N][N],f1[N][N],f2[N][N],f3[N][N],f4[N][N],row[N],col[N];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    int ans;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j];
    for(int i=k;i<=n;i++)
        for(int j=k;j<=m;j++)
            s[i][j]=pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            f1[i][j]=max(s[i][j],max(f1[i-1][j],f1[i][j-1]));
    for(int i=1;i<=n;i++)
        for(int j=m;j>=1;j--)
            f2[i][j]=max(s[i][j+k-1],max(f2[i-1][j],f2[i][j+1]));
    for(int i=n;i>=1;i--)
        for(int j=m;j>=1;j--)
            f3[i][j]=max(s[i+k-1][j+k-1],max(f3[i+1][j],f3[i][j+1]));
    for(int i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
            f4[i][j]=max(s[i+k-1][j],max(f4[i+1][j],f4[i][j-1]));
    for(int i=k;i<=n-k;i++)
        for(int j=k;j<=m-k;j++)
        {
            ans=max(ans,f1[i][j]+f2[i][j+1]+f3[i+1][1]);    //┴
            ans=max(ans,f2[i][j+1]+f3[i+1][j+1]+f4[1][j]);  //├
            ans=max(ans,f3[i+1][j+1]+f4[i+1][j]+f1[i][m]);  //┬
            ans=max(ans,f4[i+1][j]+f1[i][j]+f2[n][j+1]);    //┤
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            row[i]=max(row[i],s[i][j]),col[j]=max(col[j],s[i][j]);
    for(int i=k;i<=n-k-k;i++)
        for(int j=i+k,mid=row[j];j<=n-k;j++,mid=max(mid,row[j]))
            ans=max(ans,f1[i][m]+mid+f3[j+1][1]);
    for(int i=k;i<=n-k-k;i++)
        for(int j=i+k,mid=col[j];j<=n-k;j++,mid=max(mid,col[j]))
            ans=max(ans,f1[n][i]+mid+f3[1][j+1]);
    printf("%d\n",ans);
    return 0;
}

P.S.

写的我好难受...

原文地址:https://www.cnblogs.com/VisJiao/p/LgP3625.html

时间: 2024-07-30 20:25:53

洛谷P3625 - [APIO2009]采油区域的相关文章

洛谷 P3625 [APIO2009]采油区域【枚举】

参考:https://blog.csdn.net/FAreStorm/article/details/49200383 没有技术含量但是难想难写,枚举情况图详见参考blog懒得画了 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1505; int n,m,k,a[N][N],b[N][N],c[N][N],d[N][N],s[N][N],p

洛谷3627 [APIO2009]抢掠计划

题目描述 输入格式: 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点和终点的路口编号.接下来 N 行,每行一个整数,按顺序表示每 个路口处的 ATM 机中的钱数.接下来一行包含两个整数 S.P,S 表示市中心的 编号,也就是出发的路口.P 表示酒吧数目.接下来的一行中有 P 个整数,表示 P 个有酒吧的路口的编号. 输出格式: 输出一个整数,表示 Banditji

[APIO2009]采油区域

https://zybuluo.com/ysner/note/1144701 题面 给出一个\(n×m\)的矩阵.请在其中选择\(3\)个互不相交的,大小恰为\(k×k\) 的子矩阵,使得子矩阵的权值和最大. \(n\leq1500,m\leq1500\) 解析 这题和CJOJ2501很像呢... 看到题,本能地打了一个\(DP\),然后至今调不出来... 解法一 矩阵对应端点为其右下方端点,\(S[i][j]\)即为其面积. \(f[i][j]\)表示选择\((i,j)\)这个点对应矩阵,并且

洛谷OJ P1074 靶形数独 解题报告

洛谷OJ P1074 靶形数独 解题报告 by MedalPluS 题目描述  小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,

洛谷P1726 上白泽慧音

P1726 上白泽慧音 124通过 343提交 题目提供者yeszy 标签图论 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 给两组数据吧! 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之里由N个村庄(编号为1..N)和M条道路组成,道路分为两种一种为单向通行的,一种为双向通行的,分别用1和2来标记.如果存在由村庄A到达村庄B的通

[NOI2010] [洛谷P2046] 海拔 [50&#39;]

题目描述 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向 道路连接主干道上两个相邻的交叉路口.下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路.小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向

洛谷P1784 数独

To 洛谷.1784 数独(类似(或者说相同)题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战) 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的. 芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战. 这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这

洛谷1003 铺地毯 解题报告

洛谷1003 铺地毯 本题地址:http://www.luogu.org/problem/show?pid=1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上. 地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号.注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖. 输

【洛谷P2704【NOI2001】】炮兵阵地

题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见