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

POJ 2593&&2479:Max Sequence

編輯:C++入門知識

POJ 2593&&2479:Max Sequence


Max Sequence Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16329   Accepted: 6848

Description

Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N).

\

 

You should output S.

 

Input

The input will consist of several test cases. For each test case, one integer N (2 <= N <= 100000) is given in the first line. Second line contains N integers. The input is terminated by a single line with N = 0.

Output

For each test of the input, print a line containing S.

Sample Input

5-5 9 -5 11 200

Sample Output

40

題意是給出一個序列,求這個序列中兩個子序列的和的最大值。 兩三年前切了POJ2479,但當時還很不理解dp (當然現在對dp的理解程度也就能切切dp水題。。。)。所以做這道題的時候無限感慨。 其實求一個序列的和的最大值很簡單,即dp[i]=max(dp[i-1]+value[i], value[i]) 現在它要求兩個序列的和的最大值。所以想到從左邊來一次,從右邊來一次。 left[i]表示從第1個數字到當前第i個數字為止,左邊的最大序列和。 right[i]表示從第Test個數字(從右向左)到第i個數字為止,右邊的最大序列和。
代碼:
#include 
#include 
#include 
using namespace std;

int left_v[100005];
int right_v[100005];
int value[100005];

int main()
{
	int Test;
	while(cin>>Test)
	{
		if(!Test)
			break;
		
		left_v[0]=0;
		right_v[0]=0;
		left_v[Test+1]=0;
		right_v[Test+1]=0;

		int i,max_v=-100000000;
		for(i=1;i<=Test;i++)
		{
			cin>>value[i];
		}
		left_v[1]=value[1];
		right_v[Test]=value[Test];

		for(i=2;i<=Test;i++)
		{
			left_v[i]=max(left_v[i-1]+value[i],value[i]);
		}
		for(i=Test-1;i>=1;i--)
		{
			right_v[i]=max(right_v[i+1]+value[i],value[i]);
		}
		for(i=2;i<=Test;i++)
		{
			left_v[i]=max(left_v[i-1],left_v[i]);
		}
		for(i=Test-1;i>=1;i--)
		{
			right_v[i]=max(right_v[i+1],right_v[i]);
		}
		for(i=1;imax_v)
				max_v=left_v[i]+right_v[i+1];
		}
		cout<

自己把這道題A掉,相當開心。2015/7/5。

 

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