题目链接

题意:给出N*N的矩阵,求一个子矩阵使得子矩阵中元素和最大

分析:

必备知识:求一组数的最大连续和

    int a[N];
int sum = ,maxn = -INF;
for(int i = ; i <= n; i++)
{
if(sum + a[i] > a[i])
sum += a[i];
else
sum = a[i];
maxn = max(sum, maxn);
}

一维数组最大连续和

假设要求的子矩阵位于 r 行到 i 行,c 列到 j 列之间怎么找出这个值呢?

方法:可以讲矩阵从 r 行 到 i 行 之间按照列求和放到一个数组中,colsum[y] 表示 y 列所有元素的和,所以对这个colsum[] 来求最大连续和 就得出解来

但是不知道 最大子矩阵 是位于那两个行之间, 需要两重循环枚举r 行 到 i 行

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int Max = ;
const int INF = 0x3f3f3f3f;
int matrix[Max][Max];
int colsum[Max],n,maxn;
int maxcolsum()
{
int ans = , colmax = -INF;
for(int i = ; i <= n; i++)
{
if(colsum[i] + ans > colsum[i])
ans += colsum[i];
else
ans = colsum[i];
if(colmax < ans)
colmax = ans;
}
return colmax;
}
int maxMatrix()
{
for(int i = ; i <= n; i++)
{
memset(colsum, , sizeof(colsum));
for(int j = i; j <= n; j++)
{
for(int k = ; k <= n; k++)
colsum[k] += matrix[j][k]; //求 从 i 行到 j 行所有的列元素的和
int ans = maxcolsum(); // 对列元素和 求 最大连续和
if(maxn < ans)
maxn = ans;
}
}
return maxn;
}
int main()
{ while (scanf("%d", &n) != EOF)
{
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
scanf("%d", &matrix[i][j]);
maxn = -INF;
printf("%d\n",maxMatrix());
}
return ;
}

POJ1050To the Max(求最大子矩阵)的更多相关文章

  1. To the max(求最大子矩阵和)

    To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47985   Accepted: 25387 Desc ...

  2. Task 4.4二维环形数组求最大子矩阵之和

    任务: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数 ...

  3. City Game UVALive - 3029(悬线法求最大子矩阵)

    题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍 求最大子矩阵(悬线法模板) 把每个格子向上延伸的空格看做一条悬线 以le[i][j],re[i][j],up[i][j]分别 ...

  4. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...

  5. poj 1050 To the Max_dp求最大子矩阵和

    题意:求最大子矩阵和 利用dp[i]每次向下更新,构成竖起的单条矩阵,再按不小于零就加起来来更新,构成更大的矩阵 #include <iostream> #include<cstdi ...

  6. POJ--1050--To the Max(线性动规,最大子矩阵和)

    To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44723 Accepted: 23679 Descript ...

  7. hdu 2870(dp求最大子矩阵)

    题意:让你求的是由同一字母组成的最大子矩阵,w可以变成a或者b,x可以变成b或者c,y可以变成a或者c,z可以变成a或者b或者c. 分析:这是hdu 1506.hdu 1505的加强版,具体的分析看我 ...

  8. hdu 1505(dp求最大子矩阵)

    题意:就是让你求出全由F组成的最大子矩阵. 分析:这是hdu 1506的加强版,只不过这道题变成了2维的,那我们就一行一行的来.具体的分析见1506的博客:http://www.cnblogs.com ...

  9. 【 HDU1081 】 To The Max (最大子矩阵和)

    题目链接 Problem - 1081 题意 Given a two-dimensional array of positive and negative integers, a sub-rectan ...

随机推荐

  1. Web Audio API 实现音频可视化

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio A ...

  2. Mecanim动画系统 制作流程

  3. jquery 使用方法(转)

    原文: http://www.cnblogs.com/Chenfengtao/archive/2012/01/12/2320490.html jQuery是目前使用最广泛的javascript函数库. ...

  4. Pearson(皮尔逊)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5727327 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察 ...

  5. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  6. iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样

    // 上传多张图片 - (void)send { // 设置初始记录量为0 self.count = 0; self.upcount = 0; // 设置初始值为NO self.isUploadPic ...

  7. Android 轻量级输入校验库:Fire Eye

    Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...

  8. Java--剑指offer(2)

    6.把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. a)使用ArrayList来存放元素 public class Solution { public static int min ...

  9. 如何用linux命令查看nginx是否在正常运行

      有时想知道nigix是否在正常运行,需要用linux命令查看nginx运行情况. 执行命令: ps -A | grep nginx  如果返回结果的话,说明有nginx在运行,服务已经启动. 如果 ...

  10. Jenkins_获取源码编译并启动服务(二)

    一.创建Maven项目   二.设置SVN信息   三.设置构建触发器   四.设置Maven命令   五.设置构建后发邮件信息(参考文章一) 六.设置构建后拷贝文件到远程机器并执行命令   来自为知 ...