最大子矩阵

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

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
 
动态规划题:解这一题的关键是要把二维的数组化为一位数组。按照要求,我们可以把数组每连续的y列求和当做一列,然后就可以把这一列当做是一位数组求得所需的最大子序列和即为子矩阵的最大和。
 #include <iostream>
#include <cstdio>
using namespace std;
#define N 1005
int arr[N][N]; int main()
{
int t, m, n, x, y;
int i, j, k, l, sum, max;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&m,&n,&x,&y);
memset(arr,,sizeof(arr));
for(i=; i<=m; i++)
for(j=; j<=n; j++)
{
scanf("%d",&arr[i][j]);
arr[i][j] += arr[i][j-]; //每一列等于前面所有列对应的和
}
sum = ;
max = ;
for(i=x; i<=m; i++)
{
for(j=; j<=n-y; j++)
{
for(k=j; k<j+y; k++)
sum += (arr[k][i]-arr[k][i-x]); //括号里的所有可能得x列的和
if(sum>max)
max = sum;
sum = ;
}
}
printf("%d\n",max);
}
return ;
}

相似的题目还有杭电1081  链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081

 

hdu 1559 最大子矩阵的更多相关文章

  1. HDU 1559 最大子矩阵 (DP)

    题目地址:pid=1559">HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每一个矩阵的左上方的 ...

  2. hdu 1559 最大子矩阵 (简单dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1559 #include <cstring> #include <cstdlib> ...

  3. ACM HDU 1559 最大子矩阵

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1559 这道题 挺好的,当时想出解法的时候已经比较迟了.还是平时看得少. 把行与列都进行压缩.ans[i ...

  4. hdu 1559 最大子矩阵(DP)

    题目链接:点击链接 #include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int d[1005][1 ...

  5. hdu 1081(最大子矩阵和)

    题目很简单,就是个最大子矩阵和的裸题,看来算法课本的分析后也差不多会做了.利用最大子段和的O(n)算法,对矩阵的行(或列)进行 i和j的枚举,对于第 i到j行,把同一列的元素进行压缩,得到一整行的一维 ...

  6. hdu 1505(最大子矩阵)

    City Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  7. hdu 1081(最大子矩阵)

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. hdu 1506 最大子矩阵面积

    //写动态规划的题目 要把主要问题提炼出来 这里的问题就是求area=(j-k+1)*a[i]  如果找到j k是解决这个题目的关键 这里暴力求肯定是要超时的 这里用dp来优化 #include< ...

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

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)  ...

随机推荐

  1. Tornado 学习笔记13 TCPServer

         为了实现TCPServer的功能,定义一个类用于继承TCPServer并实现handle_stream方法.HttpServer就是一个很好的例子. 13.1 构造函数 def __init ...

  2. Python中的dict和set

    1.dict定义: Python写一个dict如下: >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d[' ...

  3. 聊下并发和Tomcat线程数(错误更正)

    本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池 ...

  4. python函数

    一.函数: 创建函数:使用def语句 举例:定义一个返回斐波那楔数列列表的函数 def fibs(num): result = [0,1] for i in range(num-2): result. ...

  5. *HDU3486 RMQ+二分

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. Android 之 ListView的学习

    ListView 是一个控件,一个在垂直滚动的列表中显示条目的一个控件,这些条目的内容来自于一个ListAdapter .EditText Button TextView ImageView Chec ...

  7. java并发编程(七)synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.     一.当两个并发线程访问同一个对象object中的这个synchronized( ...

  8. C 符号

    语言的运算符可分为以下几类: 1 算术运算符 用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(–)共七种. 2.关系运算符 用于比较运算.包括 ...

  9. 简单实用JSTL标签库

    1. JSTL标签库是一个什么东东? 简单来说,有了它你就可以在类似HTML的JSP页面里面运用一些高级语法,实现迭代.条件判断.XML文档操作.国际化标签.SQL标签. 2. 如何使用 ? 参考网址 ...

  10. Apache Traffic Server(ats)

    零.前言1.官网 http://trafficserver.apache.org/2.国内社区 https://blog.zymlinux.net3.简洁明了的配置:http://blog.csdn. ...