码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-14 21:47:19      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:acm   c++   算法   c   编程   

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

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;  
}



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

标签:acm   c++   算法   c   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/44263513

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!