hdoj_1231&&hdoj_1003最大连续子序列

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;

int Start = 0;
int End = 0;

int maxSubSum(const vector<int>& a)
{
	int maxSum = -1, thisSum = 0;
	int t = 0;
	for (int j = 0; j < a.size(); j++)
	{
		thisSum += a[j];
		if (thisSum > maxSum)
		{
			maxSum = thisSum;
			Start = t;
			End = j;
		}
		else if (thisSum < 0)
		{
			thisSum = 0;
			t = j + 1;
		}
	}
	return maxSum;
}

int main()
{
	freopen("in.txt","r",stdin);
	int n, num;
	vector<int>a;
	bool flag;
	while(scanf("%d",&n) !=EOF && n != 0)
	{
		flag = false;
		for(int i = 0; i < n; i++)
		{
			scanf("%d", &num);
			if(num >= 0) flag = true;
			a.push_back(num);
		}
		if(flag)
		{
			int sum = maxSubSum(a);
			cout << sum << " " << a[Start] << " " << a[End] << endl;
		}
		else
		{
			cout << 0 << " "<< a[0] << " " << a[a.size() - 1] << endl;
		}
		a.clear();
	}
	return 0;
}

求最大子序列和的算法见http://blog.csdn.net/lgh1992314/article/details/8257482


1003

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int Start, End, n;
int num[100005];

int DP()
{
	int thissum = 0, maxsum = -999999;
	int t = 0;
	for(int i = 0; i < n; i++)
	{
		thissum += num[i];
		if(thissum > maxsum)
		{
			maxsum = thissum;
			Start = t;
			End = i;
		}
		if(thissum < 0)
		{
			thissum = 0;
			t = i + 1;
		}
	}
	return maxsum;
}

int main()
{
	freopen("in.txt", "r", stdin);
	int t;
	scanf("%d", &t);
	for(int i = 1; i <= t; i++)
	{
		memset(num, 0, sizeof(num));
		scanf("%d", &n);
		for(int j = 0; j < n; j++)
		{
			scanf("%d", &num[j]);
		}
		Start = 0;
		End = 0;
		int maxsum = DP(); 
		printf("Case %d:\n", i);
		printf("%d %d %d\n", maxsum, Start + 1, End + 1);
		if(i != t) printf("\n");
	}
	return 0;
}


posted @ 2013-03-17 17:09  N3verL4nd  阅读(120)  评论(0编辑  收藏  举报