这题是经典的简单动归,方程用的是sum[i]=(sum[i-1]>=0?sum[i-1]+a[i]:a[i])
然后用结构体把起点终点存进去,如果sum[i-1]>0则起点不变,终点加一,否则起点转化为i。
我的代码跑得很慢,不过比较容易理解了
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
struct node{
int v,s,e;
};
int a[100010];
node dp[100010];
int main()
{
int t,n,j,i,m,maxn,ss,ee,cnt=0;
scanf("%d",&t);
while (t--)
{
cnt++;
//maxn=0;
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
maxn=a[1];
ss=1;
ee=1;
dp[0].v=0;
dp[0].s=1;
dp[0].e=0;
for (i=1;i<=n;i++)
{
if (dp[i-1].v>=0)
{
dp[i].v=dp[i-1].v+a[i];
dp[i].s=dp[i-1].s;
dp[i].e=dp[i-1].e+1;
}
else
{
dp[i].v=a[i];
dp[i].s=i;
dp[i].e=i;
}
if (maxn<dp[i].v)
{
maxn=dp[i].v;
ss=dp[i].s;
ee=dp[i].e;
}
}
//if (maxn==0)
printf("Case %d:\n",cnt);
//if (maxn>0)
printf("%d %d %d\n",maxn,ss,ee);
if (t>0) printf("\n");
}
}