题目链接

题意:给出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软件安全攻击

  2. C语言字符串与数字相互转换

    在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串.字符串是以“\0”作为结束符.C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数. ● 字符串输出函数puts. ● ...

  3. 59-chown 简明笔记

    改变文件的所有者或与文件相关联的组 chown [options] owner file-list chown [options] owner: group file-list chown [opti ...

  4. linux基础-第十二单元 硬盘分区、格式化及文件系统的管理一

    第十二单元 硬盘分区.格式化及文件系统的管理一 硬件设备与文件名的对应关系 硬盘的结构及硬盘分区 为什么进行硬盘分区 硬盘的逻辑结构 Linux系统中硬盘的分区 硬盘分区的分类 分区数量的约束 使用f ...

  5. 1110Nested Loop Join算法

    转自 http://blog.csdn.net/tonyxf121/article/details/7796657 join的实现原理 join的实现是采用Nested Loop Join算法,就是通 ...

  6. Kernel Methods (5) Kernel PCA

    先看一眼PCA与KPCA的可视化区别: 在PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?里已经推导过PCA算法的小半部分原理. 本文假设你已经知道了PCA算法的基本原理和步骤. 从原始输入 ...

  7. linux centos中使用yum安装tomcat

    在linux下部署java开发的web应用,一般采用Tomact+jre环境(可不需要apache),在RHEL和CentOS下,可以采用yum在线自动安装方式安装,具体操作如下: 可以先查看tomc ...

  8. yum命令mysql,jdk,tomcat

    一.首先使用Yum list available xxx命令罗列出远程仓库里面可以安装的包 1.列出可以安装的java包 yum list available java* 输出如下: 2.列出可以安装 ...

  9. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

  10. 【bzoj1597】 土地购买

    http://www.lydsy.com/JudgeOnline/problem.php?id=1597 (题目链接) 题意 购买n个矩形,每块土地的价格是它的面积,但可以同时购买多快土地. 这些土地 ...