zoukankan      html  css  js  c++  java
  • 求二维数组的最大子数组 ZOJ1074

    这里是题目链接。

    /*
    	题目描述:求一个n*n二维矩阵的最大子矩阵,maxSum。
    */
    
    #include<iostream>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<assert.h>
    using namespace std;
    
    //Problem C
    //2012-7-10
    //by frank
    
    const int N = 103;
    const int INF = -9999;
    
    /*
    算法思想:对于一维的数组,我们可以很容易用动态规划的方法求得最大子数组;
    所以我们将i=[0...n], j[i..n]枚举所有行的可能,然后再对每一种可能(此时可以
    将它看做是一维数组的情况),用DP求得其最大子数组。
    算法时间复杂度o(n^3)。
    */
    
    int maxSubArray(int a[], int n)
    {
    	assert(a!=NULL && n>0);
    	int cur = 0;
    	int max = INF;
    
    	for(int i=0; i<n; i++)
    	{
    		cur += a[i];
    
    		//当cur小于0时,应该重新开始计数.
    		if(cur < 0)
    			cur = 0;
    
    		if(cur > max)
    			max = cur;
    	}
    	return max;
    }
    
    int findMaxSubMatrix(int a[][N], int n)
    {
    	int tmpSum[N];
    	int max = INF;
    
    	//枚举所有行的可能组合。
    	for(int i=0; i<n; i++)
    	{
    		//将tmpSum清零。
    		memset(tmpSum,0,sizeof(tmpSum));
    		for(int j=i; j<n; j++)
    		{
    			//加上当前行的元素。
    			for(int k=0; k<n; k++)
    				tmpSum[k] += a[j][k];
    			int tmpMax = maxSubArray(tmpSum, n);
    			if(tmpMax > max)
    				max = tmpMax;
    
    		}
    	}
    	return max;
    }
    
    int main()
    {
    	int a[N][N];
    	int n = 0;
    
    	while(cin>>n && n)
    	{
    		for(int i=0; i<n; i++)
    			for(int j=0; j<n; j++)
    				cin>>a[i][j];
    		cout<<findMaxSubMatrix(a, n)<<endl;
    	}
    	
    	return 0;
    }
    

      

    多学习,多总结。
  • 相关阅读:
    Charles下载和使用
    C# mvc读取模板并修改上传到web
    nginx 安装
    python 测试:wraps
    Linux下MySQL数据库常用基本操作 一
    myeclipse新建maven项目
    java 数据导入xls
    tomcat允许跨域请求:
    Import Projects from git
    c# DataTable 序列化json
  • 原文地址:https://www.cnblogs.com/yanhaiming/p/2584036.html
Copyright © 2011-2022 走看看