题目大意:

  一个N行M列的二维矩阵,矩阵的每个位置上是一个绝对值不超过1000的整数。你需要找到两个不相交的A*B的连续子矩形,使得这两个矩形包含的元素之和尽量大。

思路:

  预处理,n2时间算出每个点左上方的数的总和,如此可以O(1)算出一个目标矩阵的和。再预处理出自底向下到每行最大的子矩阵、自右向左到每列最大的子矩阵,再n2枚举一个子矩阵,计算与其右方和下方最大的子矩阵的和即可出答案。

  至于无解虽然数据貌似没有,但只需考虑两个横放或竖放或一横一竖放可不可以即可。

  横竖的处理细节挺多,要dxx。

代码:

 #include<cstdio>
const int M=;
int n,m,x,y,i,j,ans=-,sum[M][M],lmax[M],rmax[M]; int ju(int i,int j,int x,int y){ return sum[i+x-][j]-sum[i-][j]-sum[i+x-][j-y]+sum[i-][j-y]; } void line(int n,int m,int x,int y)
{
int i,j,t;
for (i=n-x+;i;--i)
{
if (lmax[i]<lmax[i+]) lmax[i]=lmax[i+];
for (j=y;j<=m;++j)
{
t=ju(i,j,x,y);
if (t>lmax[i]) lmax[i]=t;
}
}
} void row(int n,int m,int x,int y)
{
int i,j,t;
for (i=n-y+;i;--i)
{
if (rmax[i]<rmax[i+]) rmax[i]=rmax[i+];
for (j=;j+x<m+;++j)
{
t=ju(j,i+y-,x,y);
if (t>rmax[i]) rmax[i]=t;
}
}
} void cal(int x,int y)
{
int i,j,t;
for (i=;i+x<n+;++i)
for (j=y;j<=m;++j)
{
t=ju(i,j,x,y);
if (i+x<=n && t+lmax[i+x]>ans) ans=t+lmax[i+x];
if (j<m && t+rmax[j+]>ans) ans=t+rmax[j+];
}
} int main()
{
scanf("%d%d%d%d",&n,&m,&x,&y);
for (i=;i<=n;++i)
for (j=;j<=m;++j) scanf("%d",&sum[i][j]);
for (i=;i<=n;++i)
for (j=;j<=m;++j) sum[i][j]=sum[i][j-]+sum[i-][j]+sum[i][j]-sum[i-][j-];
for (i=;i<n+;++i) lmax[i]=ans;
for (i=;i<m+;++i) rmax[i]=ans;
line(n,m,x,y),line(n,m,y,x);
row(m,n,x,y),row(m,n,y,x);
cal(x,y),cal(y,x);
if ((x+x>n || y>m) && (y+y>n || x>m) &&
(x+x>m || y>n) && (x+y>n || x>m) &&
(x+y>m || x>n) && (x+y>n || y>m) && (x+y>m || x>n)) puts("Impossible");
else printf("%d\n",ans);
return ;
}

[VijosP1764]Dual Matrices 题解的更多相关文章

  1. 【vijos】1764 Dual Matrices(dp)

    https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角), ...

  2. 习题:Dual Matrices(思路题/分治)

    tyvj1764 描述一个N行M列的二维矩阵,矩阵的每个位置上是一个绝对值不超过1000的整数.你需要找到两个不相交的A*B的矩形,使得这两个矩形包含的元素之和尽量大.注:A*B的矩形指连续的A行.B ...

  3. CF 1136A 1136B 1136C 1136D 1136E(Round546ABCDE)题解

    题目地址:https://codeforces.com/contest/1136 A: Nastya Is Reading a Book 题解:挨个判断即可,水题. 参考代码: #include< ...

  4. POJ3469:Dual Core CPU——题解

    http://poj.org/problem?id=3469 题目大意: 两个CPU,处理每个任务有不同的代价,有些对任务如果不在同一个CPU就会增加代价,求最小代价. ——————————————— ...

  5. 洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes

    P1207 [USACO1.2]双重回文数 Dual Palindromes 291通过 462提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 ...

  6. poj 3469 Dual Core CPU【求最小割容量】

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 21453   Accepted: 9297 ...

  7. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

  8. Codeforces Round #546 (Div. 2) 题解

    Codeforces Round #546 (Div. 2) 题目链接:https://codeforces.com/contest/1136 A. Nastya Is Reading a Book ...

  9. 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解

    [BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 18872  Solved ...

随机推荐

  1. 优先队列实现Huffman编码

    首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...

  2. 数组中的每一个对象执行一次方法:makeObjectsPerformSelector

    1,  为数组中的每一个button添加点击事件: [_buttonArray makeObjectsPerformSelector:@selector(addTarget:self action:( ...

  3. 【Kubernetes】K8S网络方案--最近在看的

    K8S网络-最近在看的 Create a Minikube cluster - Kubernetes Kubernetes Documentation - Kubernetes Kubernetes ...

  4. axure rp8.0 序列号,亲测可以用

    转载自:https://zhidao.baidu.com/question/428326076480233092.html aaa 2GQrt5XHYY7SBK/4b22Gm4Dh8alaR0/0k3 ...

  5. SQL Server 从数据库中查询去年的今天的数据的sql语句

    因为最近的项目的一个小功能需要实现当前数据和历史的今天做一个对比.在网上也查了很久,很多都是实现一个月内的,一年内的所有数据,昨晚突然就找到了下面的实现方法,在SQL Server2008中试了一下, ...

  6. Linux posix线程库总结

    由于历史原因,2.5.x以前的linux对pthreads没有提供内核级的支持,所以在linux上的pthreads实现只能采用n:1的方式,也称为库实现. 线程的实现,经历了如下发展阶段: Linu ...

  7. idea Error:java: Compilation failed: internal java compiler error

    idea 遇到Error:java: Compilation failed: internal java compiler error 是提示说你当前使用的编译器jdk版本不对. 按住Ctrl+Alt ...

  8. C语言-纸牌计算24点小游戏

    C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...

  9. Golang 语法学习笔记

    Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...

  10. POCO库——Foundation组件之日期时间DateTime

    日期时间DateTime:内部提供多个设计计时器.日期.时区.时间戳等: Clock.h :Clock时钟计时类,_clock:Int64类型时钟值,CLOCKVAL_MIN.CLOCKVAL_MAX ...