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

人之所以能,是相信能。

HDU ACM 1081 To The Max

相关文章:

你感兴趣的文章:

标签云: