zoukankan      html  css  js  c++  java
  • 编程之美子矩阵之和的最大值

    把二维转化为一维,再利用求最大子序列的方法求最大子矩阵.

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<assert.h>
    
    #define max(a, b) ((a) > (b) ? (a) : (b))
    
    const int neginf = 0x80000001;
    
    int a[100][100] = {0};
    
    int getMaxSum(int *b, int n)
    {
    	int curSum = 0;
    	int maxSum = neginf;
    	for(int i=0; i<n; i++)
    	{
    		if(curSum < 0)
    			curSum = 0;
    		curSum += b[i];
    		maxSum = max(maxSum, curSum);
    	}
    	return maxSum;
    }
    
    int * getSeqMatrix(int s, int e, int n)
    {
    	int *b = new int[n];
    	for(int i=0; i<n; i++)
    		b[i] = 0;
    	for(i=0; i<n; i++)
    	{
    		for(int j=s; j<=e; j++)
    		{
    			b[i] += a[j][i];
    		}
    	}
    	return b;
    }
    
    int getMaxMatrix(int n)
    {
    	int curSum = 0;
    	int maxSum = neginf;
    	for(int i=0; i<n; i++)
    	{
    		for(int j=i; j<n; j++)
    		{
    			int *b = getSeqMatrix(i, j, n);
    			curSum = getMaxSum(b, n);
    			maxSum = max(curSum, maxSum);
    			delete []b;
    		}
    	}
    	return maxSum;
    }
    
    void test()
    {
    	int n;
    	while(scanf("%d", &n)!=EOF)
    	{
    		if(n == 0) break;
    		for(int i=0; i<n; i++)
    		{
    			for(int j=0; j<n; j++)
    				scanf("%d", &a[i][j]);
    		}
    		int ret = getMaxMatrix(n);
    		printf("%d\n", ret);
    	}
    }
    
    int main()
    {
    	test();
    	return 0;
    }


  • 相关阅读:
    邮件发送的原理
    链接
    VS2010安装EntityFramework5.0
    asp.net mvc 使用Ajax
    图解WPF程序打包全过程
    MapReduce,DataJoin,链接多数据源
    Hadoop,MapReduce操作Mysql
    MapReduce,组合式,迭代式,链式
    下一代hadoop(Mapreduce),YARN/MRv2
    HBase 简介
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3014172.html
Copyright © 2011-2022 走看看