tyvj1764

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

第一行包括4个正整数N,M, A, B,之间由空格隔开。
以下N行,每行M个整数,之间由空格隔开,依次表示二维矩阵的每个元素。
输出格式

输出一行,一个整数,表示答案。如果找不到两个不相交的A*B的矩形,输出"Impossible"。
样例1
样例输入1[复制]

3 4 1 2
1 -1 3 4
-1 9 -1 1
9 8 5 2
样例输出1[复制]

25
限制
1s
提示
30%的数据满足,1 <= N, M <= 50.
另外30%的数据满足,A = B.
100%的数据满足,1 <= N, M <= 1 000, 1 <= A, B <=n,m

分析:

显然这两种有两种摆放方式,

一种是在水平线两侧,一种是在竖直线两侧。

对于第一种情况,我们枚举中间线的位置,然后将两边分开来看,求出上边区域内元素和最大的矩形,在求出下边区域元素和最大矩形,两者相加即为结果,然后找出所有值中最大的一个即可。第二种情况也一样

代码:

program t2;
var
w:array[..,..]of longint;
f,g:array[..,..]of longint;
n,i,m,j,x,a,b,t,ans:longint;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
begin
assign(input,'t2.in');
reset(input);
assign(output,'t2.out');
rewrite(output);
readln(n,m,a,b);
for i:= to n do
begin f[i,]:=-maxlongint div ; f[i,]:=-maxlongint div ; end;
for i:= to m do
begin g[i,]:=-maxlongint div ; g[i,]:=-maxlongint div ; end;
for i:= to n do
for j:= to m do
begin
read(x); w[i,j]:=w[i,j-]+w[i-,j]-w[i-,j-]+x;
end;
for i:= to n do
for j:= to m do
begin
if (i>=a)and(j>=b) then
begin
x:=w[i,j]+w[i-a,j-b]-w[i-a,j]-w[i,j-b];
f[i,]:=max(f[i,],x); g[j,]:=max(g[j,],x);
end;
if (i>=b)and(j>=a) then
begin
x:=w[i,j]+w[i-b,j-a]-w[i-b,j]-w[i,j-a];
f[i,]:=max(f[i,],x); g[j,]:=max(g[j,],x);
end;
end;
for i:=n downto do
for j:=m downto do
begin
if (i+a-<=n)and(j+b-<=m) then
begin
x:=w[i+a-,j+b-]+w[i-,j-]-w[i+a-,j-]-w[i-,j+b-];
f[i,]:=max(f[i,],x); g[j,]:=max(g[j,],x);
end;
if (i+b-<=n)and(j+a-<=m) then
begin
x:=w[i+b-,j+a-]+w[i-,j-]-w[i+b-,j-]-w[i-,j+a-];
f[i,]:=max(f[i,],x); g[j,]:=max(g[j,],x);
end;
end;
if a>b then begin t:=a; a:=b; b:=t; end;
ans:=-maxlongint;
for i:=a+ to n-a+ do f[i,]:=max(f[i,],f[i-,]);
for i:=n-a downto a do f[i,]:=max(f[i,],f[i+,]);
for i:=a+ to m-a+ do g[i,]:=max(g[i,],g[i-,]);
for i:=m-a downto a do g[i,]:=max(g[i,],g[i+,]);
for i:=a to n-a do
ans:=max(ans,f[i,]+f[i+,]);
for i:=a to m-a do
ans:=max(ans,g[i,]+g[i+,]);
if ans>-maxlongint then writeln(ans) else writeln('Impossible');
close(input); close(output)
end.

习题:Dual Matrices(思路题/分治)的更多相关文章

  1. 51nod P1305 Pairwise Sum and Divide ——思路题

    久しぶり! 发现的一道有意思的题,想了半天都没有找到规律,结果竟然是思路题..(在大佬题解的帮助下) 原题戳>>https://www.51nod.com/onlineJudge/ques ...

  2. POJ 1904 思路题

    思路: 思路题 题目诡异地给了一组可行匹配 肯定有用啊-. 就把那组可行的解 女向男连一条有向边 如果男喜欢女 男向女连一条有向边 跑一边Tarjan就行了 (这个时候 环里的都能选 "增广 ...

  3. BZOJ 3252: 攻略(思路题)

    传送门 解题思路 比较好想的一道思路题,结果有个地方没开\(long\) \(long\) \(wa\)了三次..其实就是模仿一下树链剖分,重新定义重儿子,一个点的重儿子为所有儿子中到叶节点权值最大的 ...

  4. BZOJ 1303: [CQOI2009]中位数图(思路题)

    传送门 解题思路 比较好想的思路题.首先肯定要把原序列转化一下,大于\(k\)的变成\(1\),小于\(k\)的变成\(-1\),然后求一个前缀和,还要用\(cnt[]\)记录一下前缀和每个数出现了几 ...

  5. 习题:Wormhole(思路题)

    tyvj1763 描述 一维的世界就是一个数轴.这个世界的狭小我们几乎无法想象.在这个数轴上,有N个点.从左到右依次标记为点1到N.第i个点的坐标为Xi.经过漫长时间的物理变化和化学变化,这个一维世界 ...

  6. ACM 杂题,思路题 整理

    UVa 11572 - Unique Snowflakes 问一个数组中,无重复数字的最长子串长度是多少. 用map维护某数字上次出现的位置.另外用变量last表示上次出现数字重复的位置. 如果出现重 ...

  7. 刷题向》一道简单的思路题BZOJ1800(EASY+)

    这道题其实并不难,主要原因是数据范围很小,当然数据如果大来也可以优化,但重点是在做的时候用的思路很通用, 所以本题是一道思想题(当然思想也不难) 标题里的“+”体现在一些边界处理中. 直接甩题目 De ...

  8. UVA 12898 - And Or 与和或 (思路题)

    思路就是有零一变化的位Or以后一定是1,And以后一定是0:那么如果b的二进制更长那么就把包含a的部分全部置为1或0,如果一样长那么就把不同的部分置为1或0. 今天被这题坑的地方:1默认是int,如果 ...

  9. CodeForces 606C--Sorting Railway Cars,思路题~~~

    C - Sorting Railway Cars   Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d &am ...

随机推荐

  1. JAVA设计模式初探之桥接模式

    生活中的一个例子:    拿汽车在路上行驶的来说.既有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶.这你会发现,对于交通工具(汽车)有不同的类型,它们所行驶的环境(路)也 ...

  2. 简析平衡树(二)——Treap

    前言 学完了替罪羊树,我决定再去学一学\(Treap\).一直听说\(Treap\)很难,我也花了挺久才学会. 简介 \(Treap\)这个名字真的挺有内涵: \(\color{red}{Tree}\ ...

  3. 2018.7.2 如何用js实现点击图片切换为另一图片,再次点击恢复到原图片

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. java基础编程——用两个栈来实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目代码 /** * <分析>: * 入队:将元素进栈A * 出队:判断栈B是否为空, * ...

  5. C# 理解FileInfo类的Open()方法

    我们在对文件进行读写操作之前必须打开文件,FileInfo类为我们提供了一个Open()方法,该方法包含了两个枚举类型值的参数,一个为FileMode枚举类型值,另一个为FileAccess枚举类型值 ...

  6. iOS常用第三方类库 Xcode插件

    第三方类库(github地址): 1.AFNetworking 网络数据     https://github.com/AFNetworking/AFNetworking 2.SDWebImage 图 ...

  7. 51nod——2476 小b和序列(预处理 思维)

    对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置.比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到 ...

  8. BZOJ2118: 墨墨的等式(最短路 数论)

    题意 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. So ...

  9. ABAP读取长文本的方法

    SAP中所有的项目文本都存在以下两张数据表中: 1. STXH  抬头项目文本 透明表 2. STXL  明细项目文本   透明表 长文本读取方法 首先在STXH和STXL中根据OBJECT NAME ...

  10. Python 文件读写 文件和路径

    1.在Windows上,使用倒斜杆作为文件夹之间的分隔符,在Linux上,使用正斜杠作为路径分隔符.在编写Python脚本时,可以os.path.join()函数来处理 在Windows环境下命令如下 ...