zoukankan      html  css  js  c++  java
  • 最大子矩阵和

    问题:就是输入一个N*M的矩阵,找出在矩阵中,所有元素加起来之和最大的子矩阵。

     思路:将输入的矩阵每一列求前几项和,此时矩阵的每一行都相当于一个二维矩阵,此后用求最大子序列求最大值即可。

    #include <stdio.h>
    #include <iostream>
    #include <math.h>
    #include <string.h>
    using namespace std;
    const double PI=acos(-1.0);
    const int inf=0x7fffffff;
    int a[105][105];
    int dp[105][105];
    int n,m,mx,sum; 
    
    int main(){
    	mx=-inf;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			cin>>a[i][j];
    			mx=max(mx,a[i][j]);
    		}
    	}
    	if(mx<0) cout<<mx;//若矩阵最大元素都小于0,直接输出最大值即可 
    	else{
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				a[i][j]=a[i-1][j]+a[i][j];//将每一列求前几项和,此后的每一行都可以理解成一个二维矩阵。 
    			}
    		}
    	    for(int i=1;i<=n;i++){           //i:减去矩阵的行数 
    			for(int j=i;j<=n;j++){       //j:处理的矩阵开始的行数 
    				sum=0;                   //每次处理一个矩阵开始,sum归0 
    				for(int k=1;k<=m;k++){   //每次处理矩阵要遍历每一列,相当于用求最大子序列算法 
    					if(sum+a[j][k]-a[i-1][k]<0){
    						sum=0;
    					}
    					else{
    						sum+=a[j][k]-a[i-1][k];
    					}
    					mx=max(mx,sum);      //每处理完一个矩阵要更新最大值 
    				}
    			}
    		}
    	}
    	cout<<mx;
    	return 0; 
    }
    

      

  • 相关阅读:
    韩寒做错了(update 4 12)。
    放弃IE6。
    阿弥陀佛,我没有“抄袭”。
    婚姻。
    爆牙齿饭否?
    地震之后——和妈妈对话。
    8年前,《西班牙,我为你哭泣。》
    在等决赛中提问。
    地震之后——中国互联网在黑夜中哭泣。
    年轻。
  • 原文地址:https://www.cnblogs.com/xusi/p/12356519.html
Copyright © 2011-2022 走看看