HDU1559 最大子矩阵 (二维树状数组)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559

最大子矩阵

Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2901    Accepted Submission(s): 1454

Problem Description

给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。

Input

输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。

Output

对于每组数据,输出一个整数,表示子矩阵的最大和。

Sample Input

1

4 5 2 2

3 361 649 676

588
992 762 156

993 169
662 34

638 89 543
525

165 254 809 280

Sample Output

2474

Author

lwg

Source

HDU 2006-12 Programming Contest

Recommend

LL   |   We have carefully selected several similar problems for you:  1081 1003 1505 1257 1024

 1 /*二维树状数组:同样不要忘记c的初始化,
 2 modify 的功能是改变元素(x, y),
 3 sum的功能则是求从元素(1, 1)开始到(x, y)的总和,
 4 同样,可以求出任意一个子矩阵内的所有元素之和,
 5 即sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1)
 6 */
 7
 8
 9 #include<iostream>
10
11 using namespace std;
12
13 int N,M;
14 int c[1005][1005];
15
16 int lowbit( int x )
17 {
18     return x & (-x);
19 }
20
21 void modify( int x, int y, int delta )
22 {
23     int i, j;
24     for(i=x; i<=N; i+=lowbit(i))
25     {
26         for(j=y; j<=M; j+=lowbit(j))
27         {
28             c[i][j] += delta;
29         }
30     }
31 }
32
33 int sum( int x, int y )
34 {
35     int res = 0, i, j;
36     for(i=x; i>0; i-=lowbit(i))
37     {
38         for(j=y; j>0; j-=lowbit(j))
39         {
40             res += c[i][j];
41         }
42     }
43 return res;
44 }
45
46 void init ()
47 {
48     int i,j;
49     for(i=0;i<=N;i++)
50         for(j=0;j<=M;j++)
51             c[i][j]=0;
52
53 }
54
55 int main()
56 {
57     int t;
58     scanf("%d",&t);
59     while(t--)
60     {
61         int x,y,i,j,k,temp;
62         int max = 0 ;
63     //    memset(c,0,sizeof(c));
64     //    c[1005][1005]= {{0}};
65         scanf("%d%d%d%d",&N,&M,&x,&y);
66         init ();
67
68         for(i=1;i<=N;i++)
69             for(j=1;j<=M;j++)
70             {
71                 scanf("%d",&k);
72                 modify(i,j,k);
73             }
74         for(i=1;i+x-1<=N;i++)
75             for(j=1;j+y-1<=M;j++)
76             {
77                 temp=sum(i+x-1,j+y-1)-sum(i-1,j+y-1)-sum(i+x-1,j-1)+sum(i-1,j-1);
78
79                 if(temp>max)max= temp ;
80             }
81         printf("%d\n",max);
82
83
84     }
85     return 0 ;
86
87 }

HDU1559 最大子矩阵 (二维树状数组),布布扣,bubuko.com

时间: 2024-11-29 00:23:28

HDU1559 最大子矩阵 (二维树状数组)的相关文章

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一

二维树状数组——SuperBrother打鼹鼠(Vijos1512)

树状数组(BIT)是一个查询和修改复杂度都为log(n)的数据结构,主要用于查询任意两位之间的所有元素之和,其编程简单,很容易被实现.而且可以很容易地扩展到二维.让我们来看一道很裸的二维树状数组题: 在一个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……).洞口都在一个大小为n(n<=1024)的正方形中.这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1).洞口所在的位置都是整点,就是横纵坐标都为整数的点.而SuperBrother

POJ2155 Matrix 二维树状数组应用

一个N*N(1<=N<=1000)的矩阵,从(1,1)开始,给定一些操作C和一些查询Q,一共K条(1<=K<=50000): C x1,y1,x2,y2 表示从x1行y1列到x2行y2列的元素全部反转(0变成1,1变成0): Q x y表示询问x行y列的元素是0还是1. 题目乍一看感觉还是很难,如果能记录每一个元素的状态值,那答案是显而易见的,但是元素过多,如果每次都对每一个元素进行更新状态的话,复杂度太高.实际上只要记录边界的特定坐标的反转次数,最好的选择那就是二维树状数组了.

2018年四校联合周赛-第二场 B.异或和问题(二维树状数组)

异或和问题 TimeLimit:1000MS  MemoryLimit:256MB 64-bit integer IO format:%I64d Problem Description 现在有一个n行n列的矩阵.初始状态下,矩阵里的所有值都为0.行的编码是从1到n,列的编码也同样是从1到n. ai,?j.是在第i行第j列的数.子矩阵(x0, y0, x1, y1)是由ai,?j. (x0?≤?i?≤?x1, y0?≤?j?≤?y1)组成的矩阵. 现在需要进行下列的两个操作:       1.查询

POJ2155/LNSYOJ113 Matrix【二维树状数组+差分】【做题报告】

这道题是一个二维树状数组,思路十分神奇,其实还是挺水的 题目描述 给定一个N∗NN∗N的矩阵AA,其中矩阵中的元素只有0或者1,其中A[i,j]A[i,j]表示矩阵的第i行和第j列(1≤i,j≤N)(1≤i,j≤N),初始矩阵元素都是0.在矩阵上进行TT次操作,操作有以下两种: (1)格式为C x1 y1 x2 y2(1≤x1≤x2≤n,1≤y1≤y2≤n)C x1 y1 x2 y2(1≤x1≤x2≤n,1≤y1≤y2≤n) ,其中CC为字符“C”,表示把以(x1,y1)(x1,y1)为左上角,

YBT1540打鼹鼠_二维树状数组

1540:打鼹鼠_二维树状数组 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 这是一道模板题. 给出一个 n×m 的零矩阵 A,你需要完成如下操作: 1 x y k:表示元素 Ax,y自增 k: 2 a b c d:表示询问左上角为 (a,b),右下角为 (c,d) 的子矩阵内所有数的和. [输入] 输入的第一行有两个正整数 n,m: 接下来若干行,每行一个操作,直到文件结束. [输出] 对于每个 2 操作,输出一个整数,表示对于这个操作的回答. [输

POJ 1195 Mobile phones(二维树状数组)

题目链接:POJ 1195 题意: 给出一个S*S的矩阵(行.列号从1开始),每个元素初始值为0,有两种操作:一种是第X行第Y列元素值加A:另一种是查询给定范围矩阵的所有元素之和(L<=X<=R,B<=Y<=T). 分析: 查询给定范围矩阵的所有元素之和是二维区间和,可以转换为二维前缀和求值.类比一维前缀和求法,二维区间和S(L, B, R, T) = S(1, 1, R, T) - S(1 ,1, L-1, T) - S(1, 1, R, B-1) + S(1, 1, L-1,

POJ 2155 Matrix(二维树状数组,绝对具体)

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20599   Accepted: 7673 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1