HDU 1231 最大连续子序列 DP题解

典型的DP题目,增加一个额外要求,输出子序列的开始和结尾的数值。

增加一个记录方法,nothing special。

记录最终ans的时候,同时记录开始和结尾下标;

更新当前最大值sum的时候,更新开始节点。

const int MAX_N = 10001;
long long arr[MAX_N];
int N, sta, end;

long long getMaxSubs()
{
	long long sum = 0, ans = LLONG_MIN;
	int ts = 0;
	for (int i = 0; i < N; i++)
	{
		sum += arr[i];
		if (ans < sum)
		{
			ans = sum;
			end = i;
			sta = ts;
		}
		if (sum < 0)
		{
			sum = 0;
			ts = i+1;
		}
	}
	return ans;
}

int main()
{
	while (~scanf("%d", &N) && N)
	{
		for (int i = 0; i < N; i++)
		{
			scanf("%I64d", arr+i);
		}
		long long ans = getMaxSubs();
		if (ans < 0ll)
		{
			printf("%d %I64d %I64d\n", 0, arr[0], arr[N-1]);
		}
		else
		{
			printf("%I64d %I64d %I64d\n", ans, arr[sta], arr[end]);
		}
	}
	return 0;
}


\

你可能感兴趣的:(Algorithm算法)