ZOJ 1074 最大子矩阵和
Description
0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 is in the lower left corner:
9 2 -4 1 -1 8 and has a sum of 15.
Input
Output
Sample Input
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
Sample Output
15 题意:求最大的子矩阵的和 解题思路:通过循环,用b[k]数组储存每列的和,例如当循环到第2行时,b[0]储存的就是5。 5是怎么来的呢?它是0+9+(-4)=5。
b[1]储存的就是1。 -2+2+1=1 这样求出每列的和然后同时找b[k]序列的最大子段和,不断更新最大值,循环完之后,就可以找出最大值了..... 也许这样比较抽象,举个栗子:(这里就不用N行N列的做例子了.....) 2维数组:
1 2 3
-5 6 7
我们先求
第0行 b数组 1 2 3 最大子段和:1+2+3=6 这里可以理解为 这是 1 2 3 这个子矩阵
第1行
b数组 -4 8 10 最大子段和:8+10=18 这里就是 2 3
6 7 这个子矩阵 所以答案就是18 怎么说,思想应该是通过求每列的和,使得它变成一个求最大字段和的问题......... 代码如下:(去掉注释,也许会对理解思路有帮助....)
#include<stdio.h>
#include <limits>
#include<string.h>
using namespace std;
int a[][],b[];
int n,cursum=-,max=numeric_limits<int>::min(); int curmaxsum()
{
int sum=0,cursum=-130;
for(int i=; i<n; i++)
{
sum+=b[i];
if(sum<)
sum=b[i];
if(sum>cursum)
cursum=sum;
}
return cursum;
} int maxsub()
{
for(int i=; i<n; i++)
{
memset(b,,sizeof(b));
for(int j=i; j<n; j++)
{
//printf("\nj=%d\n",j);
for(int k=; k<n; k++)
{
b[k]+=a[j][k];
}
/*for(int k=0; k<n-1; k++)
printf("%d ",b[k]);
printf("%d\n",b[n-1]);*/ curmaxsum();
//printf("cursum=%d\n",cursum);
if(cursum>max)
max=cursum;
// printf("max=%d\n",max);
}
}
return max;
} int main()
{
while(scanf("%d",&n)==)
{
for(int i=; i<n; i++)
for(int j=; j<n; j++)
scanf("%d",&a[i][j]);
// printf("******************************\n\n");
maxsub();
printf("%d\n",max);
}
return ;
}
ZOJ 1074 最大子矩阵和的更多相关文章
- ZOJ 1074 To the Max(DP 最大子矩阵和)
To the Max Time Limit: 2 Seconds Memory Limit: 65536 KB Problem Given a two-dimensional array o ...
- ZOJ 1074 To the Max
原题链接 题目大意:这是一道好题.在<算法导论>这本书里面,有一节是介绍如何求最大子序列的.这道题有点类似,区别是从数组变成了矩阵,求最大子矩阵. 解法:完全没有算法功底的人当然不知道最大 ...
- HDOJ 1081(ZOJ 1074) To The Max(动态规划)
Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle ...
- [LeetCode] 1074. 元素和为目标值的子矩阵数量
矩阵前缀和.因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性.所以这个题也就没什么弯弯绕绕.个人感觉算不上个Hard题目. 最直观的思路就是枚举子矩阵,既枚举矩阵的左上角节点和右 ...
- ZOJ 3367 Counterfeit Money(最大相同子矩阵)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3909 题意:给出两个矩阵A和B,找出最大的相同子矩阵S.输出S的高和 ...
- ZOJ题目分类
ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...
- ZOJ 刷题记录 (。・ω・)ノ゙(Progress:31/50)
[热烈庆祝ZOJ回归] P1002:简单的DFS #include <cstdio> #include <cstring> #include <algorithm> ...
- ZOJ 1859 Matrix Searching(二维线段树)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...
- ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题
我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...
随机推荐
- js判断图片上传时的文件大小,和宽高尺寸
今天在做图片上传的小功能,使用了一个kissy上传组件.很好奇它是如何在图片上传前,检测到图片的大小和尺寸的?我们来写个小实例实现一下吧 如何读取图片的size 首先,原生input file控件有个 ...
- toad for oracle 快捷键 转
序号 功能说明 快捷键 备注 1 隐藏查询结果 F2 2 查看对象详细信息 F4 3 清空屏幕 F7 4 调出以前执行的sql命令 F8 5 执行全部sql F9 6 直接执行当前sql CTRL+E ...
- ConcurrentHashMap和Hashtable区别
Hashtable:synchronized是针对整张Hash表的,即每次锁住整张表让线程独占安全的背后是巨大的浪费 ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以 ...
- Android 内存分析工具 MAT(Memory Analyzer Tool)
如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...
- 转:艾瑞咨询2016 IM云的发展趋势
转自: http://www.cnblogs.com/lingyunhu/p/rtc63.html
- MVC清除缓存设置+数据验证
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)] [Table("User")]:定义UserD ...
- C# 32位md5
/// <summary> /// 获得32位的MD5加密 /// </summary> /// <param name="str">加密字符串 ...
- css图片映射
a <div class="imagemap"> <img src="img/map.png" width="496px" ...
- Linux 命令 - printenv: 打印全部或部分环境信息
命令格式 printenv [OPTION]... [VARIABLE]... 命令参数 -0, --null 以空字符而非换行符结束每一输出行. --help 显示帮助信息. --version 显 ...
- ZooKeeper(3.4.5) - 配置伪集群模式
1. 准备 Java 运行环境,需要安装 Java1.6 或更高版本的 JDK. 2. 下载 ZooKeeper 的稳定版本 zookeeper-x.x.x.tar.gz,将其解压,约定目录名称为 % ...