典型的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;
}\
HDU 1231 最大连续子序列 DP题解,布布扣,bubuko.com
原文:http://blog.csdn.net/kenden23/article/details/38521757