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


  • 相关阅读:
    3.1 history跳转页面产生跨域问题
    2021年6月7日 团队冲刺第二阶段04
    2021年6月6日 团队冲刺第二阶段03
    2021年6月5日 团队冲刺第二阶段02
    2021年6月4日 团队冲刺第二阶段01
    2021年6月3日
    2021年6月2日
    2021年6月1日
    2021年5月31日
    2021年5月30日
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3014172.html
Copyright © 2011-2022 走看看