程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVa 108: Maximum Sum

UVa 108: Maximum Sum

編輯:C++入門知識

這道題用暴力解法+動態規劃。分析如下:

對於某個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;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved