HDU ACM 1081 To The Max->最大子矩阵

分析:利用求最大子段和的思想进行求解。

1、首先累加s[i][j],表示第j列中i从第1行加到第i行的和。

2、对每一列的i1到i2行的和进行计算(0<i1<i2<=n),得出t[k],k表示列值。

3、对t[k]求最大字段和。

4、对所有t[k]求出的最大字段和求最大值,即可得到最大子矩阵的和。

5、注意:对maxres=0;maxres|=1<<31;的解释,二进制最高位(符号位)置1,其他所有位置0,该数可以变为最小负数,前提为有符号数。

#include<iostream>
using namespace std;

int GetMaxNum(int a[],int n)  //求最大字段和
{
	int i,sum=0,maxsum=0;

	maxsum|=1<<31;
	for(i=1;i<=n;i++)
	{
		sum+=a[i];
		if(sum<a[i])
			sum=a[i];
		if(maxsum<sum)
			maxsum=sum;
	}
	return maxsum;
}

int main()
{
	int n,i,j,k,a;
	int s[102][102],t[102];
	int res,maxres;

	while(cin>>n)
	{
		for(i=0;i<=n;i++)         //初始化,方便计算
			s[i][0]=s[0][i]=0;

		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				cin>>a;
				s[i][j]=s[i-1][j]+a; //读入时就处理,累加每一列的和,s[i][j]表示第j列中i从第1行加到第i行的和
			}

		maxres=0;
		maxres|=1<<31;           //maxres二进制最高位(符号位)置1变为负数,变为最小负数
		for(i=0;i<n;i++)
			for(j=i+1;j<=n;j++)
			{
				for(k=1;k<=n;k++)
					t[k]=s[j][k]-s[i][k];        //t[k]表示第k列中第i行到第j行的和
				res=GetMaxNum(t,n);
				if(maxres<res)
					maxres=res;
			}
		cout<<maxres<<endl;
	}
    return 0;
}
时间: 2024-12-14 18:49:19

HDU ACM 1081 To The Max->最大子矩阵的相关文章

HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)

Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. I

hdu 1081 To The Max(dp+化二维为一维)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081 To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8839    Accepted Submission(s): 4281 Problem Description Given a two-dimensional ar

HDU 1081 To The Max(DP)

题意  求一个n*n矩阵的最大子矩阵和 HDU 1003 max sum 的升级版   把二维简化为一维就可以用1003的方法去做了  用mat[i][j]存  第i行前j个数的和   那么mat[k][j]-mat[k][i]就表示第k行  第i+1个数到第j个数的和了   再将k从一枚举到n就可以得到这个这个宽度为j-i的最大矩阵和了   然后i,j又分别从1枚举到n就能得到结果了   和1003的方法一样  只是多了两层循环 #include<cstdio> #include<cs

HDU ACM 1103 Flo&#39;s Restaurant

分析:借助STL的min_element实现.每次更新最先被占用的桌子,具体见注释. #include<iostream> #include<algorithm> using namespace std; int main() { int A,B,C; char s[10]; int a[102],b[102],c[102]; int curtime,count,ans; int *p; //桌子最先空闲时间 while(cin>>A>>B>>C

hdu acm 1425 sort(哈希表思想)

sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25803    Accepted Submission(s): 7764 Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且

HDU ACM 1005 Number Sequence

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 119732    Accepted Submission(s): 29072 Problem Description A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A

hdu acm 1166 敌兵布阵 (线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37903    Accepted Submission(s): 15985 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU ACM 1025 Constructing Roads In JGShining&amp;#39;s Kingdom-&amp;gt;二分求解LIS+O(NlogN)

#include<iostream> using namespace std; //BFS+优先队列(打印路径) #define N 500005 int c[N]; int dp[N]; //dp[i]保存的是长度为i的最长不降子序列的最小尾元素 int BS(int n,int x) //二分查找下标,当x比全部元素小时下标为1,比全部元素大时下标为n+1. { int low,high,mid; low=1,high=n; while(low<=high) { mid=(low+h

杭电 HDU ACM 圆桌会议

圆桌会议 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3356    Accepted Submission(s): 2351 Problem Description HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有