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

      

  • 相关阅读:
    CKA-Kubernets(K8s) (一)
    CKA-docker 容器的管理
    CKA-docker 镜像的管理
    CKA-docker 基础
    开年自省系列—— 阅读完一本书《财务之路系列》 读书笔记
    Sublime开启VIM模式
    JavaScript 踩坑开始(ing...)
    代码思考题玩玩
    P2016 战略游戏-树形DP
    皇宫看守-树形DP
  • 原文地址:https://www.cnblogs.com/xusi/p/12356519.html
Copyright © 2011-2022 走看看