zoukankan      html  css  js  c++  java
  • UVa 108: Maximum Sum

    这道题用暴力解法+动态规划。分析如下:

    对于某个1*m的矩阵,即一个数列,求其maximal sub-rectangle,可以通过求最大长连续字串和来求得(这个用到了动态规划)。

    那么对于n*m的矩阵,将每列的各个数字求和,将得到一个1*m的矩阵,用上文所说的方法求得的最大和即为该n*m矩阵的所有行数为n的子矩阵中的最大子矩阵和。

    那么这道题,通过枚举所有行数为1、2、3.....N 的矩阵(暴力),分别用上述方法压缩矩阵求最大连续字串和,找出其中最大值,即为所求结果。

    我的解题代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int table[100][100];
    int sum[100];
    int N;
    
    int max_continuous_sum()
    {
    	int maxs=0,s=0;
    	for(int i=0; i<N; i++)
    	{
    		if(s>=0) s+=sum[i];
    		else s=sum[i];
    		maxs = maxs>s ? maxs : s;
    	}
    	return maxs;
    }
    int main()
    {
    	cin >> N;
    	int maxsum=0;
    	int tmp;
    	for(int i=0; i<N; i++)
    	{
    		for(int j=0; j<N; j++)
    		{
    			cin >> table[i][j];
    			sum[j]=table[i][j];
    		}
    		tmp = max_continuous_sum();
    		maxsum = maxsum>tmp ? maxsum : tmp;
    		for(int j=i-1; j>=0; j--)
    		{
    			for(int k=0; k<N; k++)
    				sum[k]+=table[j][k];
    			tmp = max_continuous_sum();
    			maxsum = maxsum>tmp ? maxsum : tmp;
    		}
    	}
    	cout << maxsum << endl;
    	return 0;
    }
    


  • 相关阅读:
    博客开启
    .NET 异常
    .NET 深入研究
    算法研究
    数据库相关
    非比较排序算法———桶排序(箱子排序)
    非比较排序算法———计数排序
    NHibernate深入学习
    数据结构与算法
    结对编程1 四则运算生成器的改进(201421123060 61 40)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3228675.html
Copyright © 2011-2022 走看看