题目描述

为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没有马上答应他们,而是先给她们出了一道数学题,并且告诉她们:你们能获得的运动场地的面积就是你们能找到的这个最大的数字。

校长先给他们一个N*N矩阵。要求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127],例如

0 –2 –7 0 在左下角: 9 2

9 2 –6 2                     -4 1

-4 1 –4 1          -1 8

-1 8 0 –2      和为15

几个女孩子有点犯难了,于是就找到了电脑组精打细算的HZH,TZY小朋友帮忙计算,但是遗憾的是他们的答案都不一样,涉及土地的事情我们可不能含糊,你能帮忙计算出校长所给的矩形中加权和最大的矩形吗?

输入输出格式

输入格式:

第一行:n,接下来是n行n列的矩阵。

输出格式:

最大矩形(子矩阵)的和。

输入输出样例

输入样例#1: 复制

4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
输出样例#1: 复制

15

说明

n<=120

这题母题是询问一个序列的最大连续子序列的权值(把sum<0的扳为0,这样就可以重新开始新的一段子序列)

For(i,1,n)sum+=a[i],ans=max(ans,sum),if(sum<0)sum=0;

对于这题的话,会上面的就很简单了,二维压一维,s[i][j]代表第i行,0~j列的和

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c)
{
return min(min(a, b), c);
}
template <class T> inline T max(T a, T b, T c)
{
return max(max(a, b), c);
}
template <class T> inline T min(T a, T b, T c, T d)
{
return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d)
{
return max(max(a, b), max(c, d));
}
#define scanf1(x) scanf("%d", &x)
#define scanf2(x, y) scanf("%d%d", &x, &y)
#define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********\n");
#define mp make_pair
#define pb push_back
const int maxn = 2e5 + ;
// name*******************************
int s[][];
int ans=;
int n;
int x;
// function****************************** //***************************************
int main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);
// freopen("test.txt", "r", stdin);
// freopen("outout.txt","w",stdout);
cin>>n;
For(i,,n)
{
For(j,,n)
{
cin>>x;
s[i][j]=s[i][j-]+x;
}
}
//i,j定(列的序号)
For(i,,n)
{
For(j,i,n)
{
int sum=;
        //k定走的行数
For(k,,n)
{
sum+=s[k][j]-s[k][i-];
ans=max(ans,sum);
if(sum<)sum=;
}
}
}
cout<<ans;
return ;
}

最新文章

  1. Editthiscookie
  2. 深究JS异步编程模型
  3. ruby -- 进阶学习(六) devise修改邮件发送者邮箱
  4. 【UESTC 482】Charitable Exchange(优先队列+bfs)
  5. C# Winform DataGridView分页功能的实现
  6. java中无符号类型的处理
  7. C#Winform版获取Excel文件的内容
  8. 【Java基础】基础概念
  9. AFNetWorking源码详解(二)
  10. H.264视频的RTP荷载格式
  11. ASM - 条件判断
  12. 飘逸的python - 发送带各种类型附件的邮件
  13. CSS 中的内联元素、块级元素、display的各个属性的特点
  14. EEPlat PaaS 整体方案及技术原理
  15. Qt之QHeaderView加入复选框
  16. 1、突然对jQuery的心血来潮
  17. C# Redis实战(三)
  18. QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
  19. javascript之类型转换
  20. 连接HTTP服务器

热门文章

  1. 关于Datagridview控件用法的一些总结
  2. 177. [USACO Jan07] 有限制的素数
  3. RadioGroup实现类似ios的分段选择(UISegmentedControl)控件
  4. 你写的什么垃圾代码让Vsync命令不能及时处理呢?(1)
  5. Django ORM字段类型 单表增删改查 万能的双下划线
  6. Redis redis-trib集群配置
  7. 回归JavaScript基础(五)
  8. save与Update的合并操作 标签: 关系映射 2017-07-13 15:11 7人阅读 评论(0) 收藏
  9. CentOS6.4 下安装 MySql5.5.13
  10. 如何修改PPT中左下方状态栏的主题名称