[VijosP1764]Dual Matrices 题解

题目大意:

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

思路:

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

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

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

代码:

 1 #include<cstdio>
 2 const int M=1001;
 3 int n,m,x,y,i,j,ans=-2000000000,sum[M][M],lmax[M],rmax[M];
 4
 5 int ju(int i,int j,int x,int y){ return sum[i+x-1][j]-sum[i-1][j]-sum[i+x-1][j-y]+sum[i-1][j-y]; }
 6
 7 void line(int n,int m,int x,int y)
 8 {
 9     int i,j,t;
10     for (i=n-x+1;i;--i)
11     {
12         if (lmax[i]<lmax[i+1]) lmax[i]=lmax[i+1];
13         for (j=y;j<=m;++j)
14         {
15             t=ju(i,j,x,y);
16             if (t>lmax[i]) lmax[i]=t;
17         }
18     }
19 }
20
21 void row(int n,int m,int x,int y)
22 {
23     int i,j,t;
24     for (i=n-y+1;i;--i)
25     {
26         if (rmax[i]<rmax[i+1]) rmax[i]=rmax[i+1];
27         for (j=1;j+x<m+2;++j)
28         {
29             t=ju(j,i+y-1,x,y);
30             if (t>rmax[i]) rmax[i]=t;
31         }
32     }
33 }
34
35 void cal(int x,int y)
36 {
37     int i,j,t;
38     for (i=1;i+x<n+2;++i)
39         for (j=y;j<=m;++j)
40         {
41             t=ju(i,j,x,y);
42             if (i+x<=n && t+lmax[i+x]>ans) ans=t+lmax[i+x];
43             if (j<m && t+rmax[j+1]>ans) ans=t+rmax[j+1];
44         }
45 }
46
47 int main()
48 {
49     scanf("%d%d%d%d",&n,&m,&x,&y);
50     for (i=1;i<=n;++i)
51         for (j=1;j<=m;++j) scanf("%d",&sum[i][j]);
52     for (i=1;i<=n;++i)
53         for (j=1;j<=m;++j) sum[i][j]=sum[i][j-1]+sum[i-1][j]+sum[i][j]-sum[i-1][j-1];
54     for (i=1;i<n+2;++i) lmax[i]=ans;
55     for (i=1;i<m+2;++i) rmax[i]=ans;
56     line(n,m,x,y),line(n,m,y,x);
57     row(m,n,x,y),row(m,n,y,x);
58     cal(x,y),cal(y,x);
59     if ((x+x>n || y>m) && (y+y>n || x>m) &&
60         (x+x>m || y>n) && (x+y>n || x>m) &&
61         (x+y>m || x>n) && (x+y>n || y>m) && (x+y>m || x>n)) puts("Impossible");
62     else printf("%d\n",ans);
63     return 0;
64 }
时间: 2024-08-30 09:25:51

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

【vijos】1764 Dual Matrices(dp)

https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角),然后剩余空间我们只需要考虑i+1~n和j+1~m这一块空间即可(至于为什么多想想QAQ) 所以我们维护i+1~n和j+1~m能取到的最大矩形即可. 显然二维前缀和,然后再维护一个二维 mx[i][j]=max{get(i, j), mx[i+1][j], mx[i][j+1]},然后每一次找一个点i

POJ3469:Dual Core CPU——题解

http://poj.org/problem?id=3469 题目大意: 两个CPU,处理每个任务有不同的代价,有些对任务如果不在同一个CPU就会增加代价,求最小代价. ———————————————————————————— 一看,网络流,再一看,最小. 哦,最小割. 咋做啊,不会…… 查题解吧,学一学最小割的建图方法. 哦----这样啊. 割一个图,就是将图中的点分为属于源点(S)和属于汇点(T)两个集合. 那么我们将属于S的点视为用了A CPU的.所以我们建图就把S连到任务点的容量为用A

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

P1207 [USACO1.2]双重回文数 Dual Palindromes 291通过 462提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数. 编

论文笔记-Augmented Lagrange Multiplier Method for Recovery of Low-Rank Matrices

论文题目:The Augmented Lagrange Multiplier Method for Exact Recovery of Corrupted Low-Rank Matrices Abstract 1.Robust PCA问题: recovering a low-rank matrix with an unknown fraction of its entries being arbitrarily corrupted. RPCA问题是一个凸优化问题:minimizes a comb

D - Matrices with XOR property 二维树状数组+pair

Imagine A is a NxM matrix with two basic properties 1) Each element in the matrix is distinct and lies in the range of 1<=A[i][j]<=(N*M) 2) For any two cells of the matrix, (i1,j1) and (i2,j2), if (i1^j1) > (i2^j2) then A[i1][j1] > A[i2][j2] ,

1.2 Dual Palindromes

Dual PalindromesMario Cruz (Colombia) & Hugo Rickeboer (Argentina) A number that reads the same from right to left as when read from left to right is called a palindrome. The number 12321 is a palindrome; the number 77778 is not. Of course, palindrom

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了 

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)