hdu1081

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

原文地址:https://www.cnblogs.com/wangkun1993/p/6341650.html