现在的位置: 首页 > 综合 > 正文

hdu 1231 最大子段和

2013年08月17日 ⁄ 综合 ⁄ 共 585字 ⁄ 字号 评论关闭
//经典DP
//b[i] = max{b[i-1] + a[i],a[i]}
//用n^2的暴力会超时。
//注意保存子段首尾的位置
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int a[10001];
int b[10001];
int K;
bool flag;
int st,en;
int main()
{
	while(scanf("%d",&K) != EOF)
	{
		if(K == 0)
			break;
		flag = true; 
		int MAX = 0;
		int besti = 0;
		int bestj = 0;
		st = 0,en = 0; 
		for(int i = 1; i <= K; i++)
		{
			scanf("%d",&a[i]);
			if(a[i] >= 0)
				flag = false;
		}
		memset(b,0,sizeof(b));
		for(int i = 1; i <= K; i++)
		{
			if(b[i-1] > 0)
			{
				b[i] = b[i - 1] + a[i];
				en = i;
			}
			else
			{
				b[i] = a[i];  
				st = i;
				en = i;
			}
			if(b[i] > MAX)
			{
				MAX = b[i];
				besti = st;
				bestj = en;
			}
		}
		if(flag)
			cout<<"0 "<<a[1]<<" "<<a[K]<<endl; 
		else
			cout<<MAX<<" "<<a[besti]<<" "<<a[bestj]<<endl;
	}
	return 0;
}

抱歉!评论已关闭.