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;
}
浙公网安备 33010602011771号