nyoj 104 最大和

最大和

时间限制:1000 ms  |  内存限制:65535 KB

难度:5

描述

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 
例子:
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
其最大子矩阵为:

9 2 
-4 1 
-1 8 
其元素总和为15。

输入

第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;

输出

输出矩阵的最大子矩阵的元素之和。

样例输入

1

4 4

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

样例输出

15

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int map[105][105];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int r,c,i,j,k;
		scanf("%d%d",&r,&c);
		for( i=1;i<=r;i++)
			for( j=0;j<c;j++)
			{
				scanf("%d",&map[i][j]);
				map[i][j]+=map[i-1][j];//转化成一维
			}
		int sum,max;
		for( i=1,max=map[1][0];i<=r;i++)
			for( j=i;j<=r;j++)
				for( k=sum=0;k<c;k++)
				{

					int t=map[j][k]-map[i-1][k];
					sum=(sum>=0?sum:0)+t;
					max=max<sum?sum:max;
				}
		printf("%d\n",max);
	}
	return 0;
}

  

时间: 2024-10-14 00:45:08

nyoj 104 最大和的相关文章

nyoj 104 最大和 (二维最大字串和)

描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,c<=100),r.c分别代表矩阵的行和列: 随后有r行,每行有c个整数:

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

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子:0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据:每组测试数据:第一行有两个的整数r,c(0<r,c&l

nyoj 104 最大和 【dp】

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,

NYOJ 104 最大子矩阵(二维DP)

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,

最大子矩阵求和 NYOJ 104 &amp;&amp; 372 &amp;&amp; HDU 1081

链接:click here 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,c<=100),r.c分别代表矩阵的行和列: 随后有

最大值子区间和的一维二维问题

一维问题:nyoj 44 子串和 链接:click here 题目大意:给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 思路:m是元素总个数,sum是第一个元素,将当前的第一个元素作为最大值max,之后依次输入,检查sum<0?是的话更新sum为当前输入值:否则累加,最后比较这样每次步骤的最大值. 代码: #include <stdio.h> #include <mat

算法导论4--求最大和数组

1 #include<iostream> 2 #include<fstream> 3 #include<cstdlib> 4 using namespace std; 5 6 struct subArray{ 7 int low; 8 int high; 9 float sum; 10 }; 11 //分治策略 o(nlogn) 递归 12 void findMaxCross(float *A, int low,int mid,int high,subArray &am

nyoj 115------城市平乱( dijkstra // bellman )

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

NYOJ 99单词拼接(有向图的欧拉(回)路)

1 /* 2 NYOJ 99单词拼接: 3 思路:欧拉回路或者欧拉路的搜索! 4 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 5 有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 6 有向图的欧拉回路:所有的节点都有In[i]==Out[i] 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cs