题意:给一个矩阵,每个元素有正有负,求最大矩阵和。

解题:

(1)对原矩阵a用前缀和处理,处理变成矩阵sum,sum[i][j]表示从左上角为a[1][1]到右下角a[i][j]的全部元素和。

矩阵必须是连续起来的,两重循环列举所有的连续的行,再暴力循环每一列,相当于求最大连续子序列。

第i行到第j行的第k列压缩成一个数:sum[j][k]-sum[j][k-1]-sum[i-1][k]+sum[i-1][k-1];

图示:红色-黄色-蓝色+绿色

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std; int a[105][105];
int sum[105][105];
int t,n,m; int part(int i,int j,int k)///第i行到第j行在第k列上的和
{
return sum[j][k]-sum[j][k-1]-sum[i-1][k]+sum[i-1][k-1];
} int main()
{
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];///初始化矩阵前缀和 int maxx=-inf;
int x,y;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
x=part(i,j,1); ///初始值为第i行到第j行的第1列
y=x; ///存两个变量,备份,x拿来操作
for(int k=2;k<=m;k++)
{
if(x<0) ///x是从第1列进来的,如果当前的x小于0,越加越小, 不如不加,置为0再加相当于没加
x=0;
x+=part(i,j,k);///对于 加不加 第i行到第j行的第k列的部分和 ,y对每个x取最值,保存
y=max(x,y);
}
maxx=max(maxx,y);
}
}
printf("%d\n",maxx);
} return 0;
}

矩阵形式的前缀和

(2)对每一列前缀和处理,sum[i][j]表示a[1][j]到a[i][j]的和,双重暴力连续的行数,一重暴力列数,每个子列,第i行到第j行的第k列压缩成一个数:sum[j][k]-sum[i-1][k],相当于求最大连续子序列。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#include<set>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std; int a[105][105];
int sum[105][105];
int t,n,m; int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
sum[i][j]=sum[i-1][j]+a[i][j];///列的前缀和
}
}
int ans=-inf;
int now,maxx;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
now=sum[j][1]-sum[i-1][1];
maxx=now;
for(int k=2;k<=m;k++)
{
if(now<0)
now=0;
now+=sum[j][k]-sum[i-1][k];
maxx=max(now,maxx);
}
ans=max(maxx,ans);
}
}
printf("%d\n",ans);
}
return 0;
}

每列前缀和的形式

NYOJ104-最大和-(前缀和)的更多相关文章

  1. NYOJ-104最大和

    我看了好多博客,都是拿一维的做基础,一维的比较简单,所以要把二维的化成一维的,一维的题目大意:给了一个序列,求那个子序列的和最大,这时候就可以用dp来做,首先dp[i]表示第i个数能构成的最大子序列和 ...

  2. NYOJ-104最大和(动归题)及连续最大和核心

    最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩 ...

  3. Bzoj 2006: [NOI2010]超级钢琴 堆,ST表

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2222  Solved: 1082[Submit][Statu ...

  4. treap学习笔记

    treap是个很神奇的数据结构. 给你一个问题,你可以解决它吗? 这个问题需要treap这个数据结构. 众所周知,二叉查找树的查找效率低的原因是不平衡,而我们又不希望用各种奇奇怪怪的旋转来使它平衡,那 ...

  5. leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法

    Maximum Subarray  Find the contiguous subarray within an array (containing at least one number) whic ...

  6. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  7. 长度不超过n的连续最大和___优先队列

    题目链接: https://nanti.jisuanke.com/t/36116 题目: 在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币.但 ...

  8. nyoj 104——最大和——————【子矩阵最大和】

    最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个 ...

  9. 简单DP【p2642】双子序列最大和

    Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小 ...

随机推荐

  1. centos 7 重新设置分区大小

    一.基础概念Cent0S 7默认启用LVM2(Logical Volume Manager),把机器的一块硬盘分为两个区sda1和sda2,其中分区sda1作为系统盘/boot挂载,少量空间:sda2 ...

  2. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  3. Rdlc Mail Label

    1.创建报表服务器项目RDLML. 2.新建共享数据源DataMailLabel,设置到数据库AdventureWorks的连接,并为报表指定相应的访问凭据. 3.选择Name.Color.Thumb ...

  4. SQL Server的唯一键和唯一索引会将空值(NULL)也算作重复值

    我们先在SQL Server数据库中,建立一张Students表: CREATE TABLE [dbo].[Students]( ,) NOT NULL, ) NULL, ) NULL, [Age] ...

  5. SQLServer作业调用链接服务器失败解决办法

    新建一个SQL作业,语句手动执行OK,但是作业计划执行总是报错. 消息已以用户 NT SERVICE\SQLSERVERAGENT 的身份执行. 链接服务器 "172.16.10.23&qu ...

  6. java面试经常涉及到的

    需要掌握的Java知识点: 1 基本数据类型.循环控制.String类型的使用.数组.类和对象.接口和抽象类.面向对象三大特征.异常处理.集合类(List.Map.Set) 2 能够熟练使用Sprin ...

  7. 推荐算法之E&E

    一.定义 E&E就是探索(explore)和利用(exploit). Exploit:基于已知最好策略,开发利用已知具有较高回报的item(贪婪.短期回报),对于推荐来讲就是用户已经发现的兴趣 ...

  8. Mysql之索引(六)

    1.思考 在图书馆是怎么找到一本书的? 一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询有1次写操作),而且插入操作和更新操作很少出现性能问题. 遇到最多,最复杂的还是一些复杂的查询操 ...

  9. Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符)

    Python进阶----多表查询(内连,左连,右连), 子查询(in,带比较运算符) 一丶多表查询     多表连接查询的应用场景: ​         连接是关系数据库模型的主要特点,也是区别于其他 ...

  10. ssh工具推荐

    FinalShell 看图就知道功能多强大了, 官网地址 http://www.hostbuf.com