zoukankan      html  css  js  c++  java
  • 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;  
    }
    
    


  • 相关阅读:
    appium 元素定位方法
    Mac 使用MuMu模拟器调试
    渗透测试工具Drozer安装使用(Mac)
    渗透测试工具Drozer安装使用(Windows)
    python虚拟环境搭建
    HDU 6900 Residual Polynomial【分治 NTT】
    CF 1405E Fixed Point Removal【线段树上二分】
    Educational Codeforces Round 41
    Educational Codeforces Round 39
    Educational Codeforces Round 36
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5184930.html
Copyright © 2011-2022 走看看