//经典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;
}hdu 1231 最大子段和
最新推荐文章于 2020-03-06 17:17:17 发布
本文介绍了一种使用动态规划解决最大子段和问题的经典算法。通过维护一个动态数组来记录当前最大子段和,并更新子段的起始和结束位置。此算法的时间复杂度为O(n),有效地避免了n^2的暴力解法所带来的超时问题。

4362

被折叠的 条评论
为什么被折叠?



