题目大意:

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

思路:

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

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

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

代码:

  1. #include<cstdio>
  2. const int M=;
  3. int n,m,x,y,i,j,ans=-,sum[M][M],lmax[M],rmax[M];
  4.  
  5. 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]; }
  6.  
  7. void line(int n,int m,int x,int y)
  8. {
  9. int i,j,t;
  10. for (i=n-x+;i;--i)
  11. {
  12. if (lmax[i]<lmax[i+]) lmax[i]=lmax[i+];
  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+;i;--i)
  25. {
  26. if (rmax[i]<rmax[i+]) rmax[i]=rmax[i+];
  27. for (j=;j+x<m+;++j)
  28. {
  29. t=ju(j,i+y-,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=;i+x<n+;++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+]>ans) ans=t+rmax[j+];
  44. }
  45. }
  46.  
  47. int main()
  48. {
  49. scanf("%d%d%d%d",&n,&m,&x,&y);
  50. for (i=;i<=n;++i)
  51. for (j=;j<=m;++j) scanf("%d",&sum[i][j]);
  52. for (i=;i<=n;++i)
  53. for (j=;j<=m;++j) sum[i][j]=sum[i][j-]+sum[i-][j]+sum[i][j]-sum[i-][j-];
  54. for (i=;i<n+;++i) lmax[i]=ans;
  55. for (i=;i<m+;++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 ;
  64. }

[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. 项目vue2.0仿外卖APP(六)

    goods 商品列表页开发 布局编写 除了商品之外还有购物车,还有个详情页,挺复杂的. 两栏布局:左侧固定宽度,右侧自适应,还是用flex. 因为内容可能会超过手机高度,超过就隐藏.左右两侧的内容是可 ...

  2. angular.extend用法实例

      angular.extend:依次将第二个参数及后续的参数的第一层属性(不管是简单属性还是对象)拷贝赋给第一个参数的第一层属性,即如果是对象,则是引用的是同一个对象,并返回第一个参数对象. 实例一 ...

  3. The specified module could not be found

    打开IIS 信息服务,在左侧找到自己的计算机,点右键,选择属性,在主属性中选编辑,打开“目录安全性”选项卡,单击“匿名访问和验证控制”里的“编辑”按钮,在弹出的对话框中确保只选中了“匿名访问”和“集成 ...

  4. Js计算当前日,当前周开始结束时间,当前月份,当前年份

    <script type="text/javascript"> //日期加上天数后的新日期. function GetDateStr(AddDayCount) { va ...

  5. python3 TypeError: 'str' does not support the buffer interface in python

    http://stackoverflow.com/questions/38714936/typeerror-str-does-not-support-the-buffer-interface-in-p ...

  6. ARM概论(Advanced RISC Machines)

    简介 ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比, 基于(精简指令)RISC结构,指令集和相关的译码机制与微程 ...

  7. Apache 服务器搭建 总结

    安装素材准备:<1>下载jdk <2>下载apache2.0.55 <3>下载tomcat5.5 <4>下载jk(mod_jk-apache-2.0.5 ...

  8. Java获取用户ip

    /** * 获取客户端ip地址(可以穿透代理) * * @param request * @return */ public static String getRemoteAddr(HttpServl ...

  9. PEtools

    // PETools.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...

  10. Linux文件权限和访问模式

    为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限: 所有者权限:文件所有者能够进行的操作 组权限:文件所属用户组能够进行的操作 外部权限(其他权限):其他用户 ...