题目链接:https://vjudge.net/problem/HDU-1003
题意:求最大连续数字和并输出端点。
思路:状态转移方程为dp【i】=max(dp【i-1】+a【i】,a【i】)。如果前一个的dp值是负的,那么就重新起一个头,否则就接上。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
long long dp[100005],a[100005];
int main()
{
int T;
scanf("%d",&T);
int kase=0;
while(T--)
{
if(kase++)
printf("\n");
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
dp[1]=a[1];
long long l=1,r=1,ans=a[1],cur=a[1],cl=1,cr=1;
for(int i=2; i<=n; i++)
{
if(dp[i-1]+a[i]>=a[i])//注意等号 样例2的特殊要求
{
cr++;
cur+=a[i];
dp[i]=dp[i-1]+a[i];
}
else
{
cl=cr=i;
cur=a[i];
dp[i]=a[i];
}
if(ans<cur)
{
ans=cur;
l=cl;
r=cr;
}
}
printf("Case %d:\n",kase);
printf("%lld %lld %lld\n",ans,l,r);
}
return 0;
}