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,j时只需要加上max{mx[i+1][1], mx[1][j+1]}即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=1005, oo=~0u>>2;
int arr[N][N], sum[2][N][N], mx[N][N], n, m, a, b, ans=-oo; int get(int x, int y, int k) {
int ret=-oo, fx=x-(k*a)+k, fy=y-(k*b)+k, now=(k==1?0:1);
if(fx>=1 && fy>=1 && fx<=n && fy<=m) ret=max(ret, sum[now][x][y]-sum[now][fx-k][y]-sum[now][x][fy-k]+sum[now][fx-k][fy-k]);
fx=x-(k*b)+k, fy=y-(k*a)+k;
if(fx>=1 && fy>=1 && fx<=n && fy<=m) ret=max(ret, sum[now][x][y]-sum[now][fx-k][y]-sum[now][x][fy-k]+sum[now][fx-k][fy-k]);
return ret;
}
int main() {
read(n); read(m); read(a); read(b);
for1(i, 1, n) for1(j, 1, m) read(arr[i][j]);
for1(i, 1, n) for1(j, 1, m) sum[0][i][j]=sum[0][i-1][j]+sum[0][i][j-1]-sum[0][i-1][j-1]+arr[i][j];
for3(i, n, 1) for3(j, m, 1) sum[1][i][j]=sum[1][i+1][j]+sum[1][i][j+1]-sum[1][i+1][j+1]+arr[i][j];
for3(i, n+1, 0) for3(j, m+1, 0) mx[i][j]=-oo;
for3(i, n, 1) for3(j, m, 1) mx[i][j]=max(get(i, j, -1), max(mx[i][j+1], mx[i+1][j]));
for1(i, 1, n) for1(j, 1, m) ans=max(ans, get(i, j, 1)+max(mx[i+1][1], mx[1][j+1]));
if(ans==-oo) puts("Impossible");
else print(ans);
return 0;
}

描述

一个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.

【vijos】1764 Dual Matrices(dp)的更多相关文章

  1. 【vijos】1757 逆序对(dp)

    https://vijos.org/p/1757 有时候自己sb真的是不好说... 我竟然想了半天都没想到这个转移. 我是有多傻.... 我们设f[i][j]表示1~i的排列且逆序对恰好是j的方案数. ...

  2. 【BZOJ】1068: [SCOI2007]压缩(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...

  3. 【51nod1519】拆方块[Codeforces](dp)

    题目传送门:1519 拆方块 首先,我们可以发现,如果第i堆方块被消除,只有三种情况: 1.第i-1堆方块全部被消除: 2.第i+1堆方块全部被消除:(因为两侧的方块能够保护这一堆方块在两侧不暴露) ...

  4. 【bzoj1925】地精部落[SDOI2010](dp)

    题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...

  5. 【ZOJ2278】Fight for Food(dp)

    BUPT2017 wintertraining(16) #4 F ZOJ - 2278 题意 给定一个10*10以内的地图,和p(P<=30000)只老鼠,给定其出现位置和时间T(T<=1 ...

  6. 【POJ】3616 Milking Time(dp)

    Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10898   Accepted: 4591 Des ...

  7. 【POJ】2385 Apple Catching(dp)

    Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13447   Accepted: 6549 D ...

  8. 【Luogu】P3856公共子串(DP)

    题目链接 DP.设last[i][j]是第i个串字符'j'所在的最后的位置,f[i][j][k]是第一个串匹配到i,第二个串匹配到j,第三个串匹配到k,最多的公共子串数. 那么我们三重循环i.j.k, ...

  9. 【Luogu】P3847调整队形(DP)

    题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a ...

随机推荐

  1. Discuz常见小问题2-如何在数据库搜索指定关键字

    点击搜索,然后输入关键字,注意要全选或者部分选择表(一个数据库的表),点击右下角的执行   会提示有多少个匹配,可以在浏览器中直接搜索"1个匹配"来定位到哪个数据表找到了匹配项,然 ...

  2. C#秘密武器之特性

    一.概述 Attribute说白了就是一个类而已,里边一般含有一些附加信息,或者一些特殊的处理逻辑,以便告诉编译器应用该特性的东东是个奇葩,需要特殊对待! 二.使用时的注意事项 2.1. Attrib ...

  3. windows下流媒体nginx-rmtp-module服务器搭建及java程序调用fmpeg将rtsp转rtmp直播流【转】

    https://github.com/illuspas/nginx-rtmp-win32 http://bashell.sinaapp.com/archives/build-nginx-rtmp-mo ...

  4. maven 编译指定模块

    编译构建指定的模块 mvn clean install -pl   model1,model2 -am -Dmaven.test.skip=true

  5. Apache Drupal URL重写【转】

    文章来源:http://www.cnblogs.com/ghj1976/archive/2010/07/19/1780844.html 在 drupal 跟目录下有个 .htaccess 文件, 这个 ...

  6. Linux内核project导论——网络:路由:路由原理

    总览 路由表 IP层通过路由将数据包送达该送达的目的地址,这就要求在整个网络中建立正确的路由表.路由表的内容是记录要到达哪里下一跳须要发到哪里(能够是port能够是ip),如此整个网络在单个节点仅仅知 ...

  7. jpush推送

    1.下载这个压缩包,vendo文件夹,复制里面的vendo到该文件夹下. 解压 2.修改AppKey和MasterSecret就ok 了

  8. C# EF使用性能消耗列表 https://msdn.microsoft.com/zh-cn/library/cc853327.aspx

    性能注意事项(实体框架) .NET Framework (current version)   其他版本   本主题介绍 ADO.NET 实体框架的性能特征,并提供一些注意事项帮助改善实体框架应用程序 ...

  9. Linux文件压缩和打包

    gzip压缩工具 1.将etc下的所有conf文件查看后循环追加到1.txt文件中 [root@bogon gzip]# find /etc/ -type f -name '*.conf' -exec ...

  10. Linux 基础学习(第一节)

    IP地址的配置 配置临时IP地址 ifconfig etho 192.168.0.91 255.255.255.0 图形化下面配置IP地址: 重启网卡服务: shell环境配置网卡信息 必备的参数 关 ...