下面分析杭电OJ上的一道题。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
题目大意就是让你选出一段和最大的连续序列,当有几个序列和并列时,选出下标最小的的连续序列。
可以采用动态规划的思想解决,设一连续序列为a[0],a[1],...,a[n],分别以a[0],a[1],...,a[n]结尾的最大序列和为d[0],d[1],...,d[n]
若d[i-1]>0,则d[i]=d[i-1]+a[i],若d[i-1]<0,则d[i]=a[i],则d[i]为结尾的最大序列和为max(a[i],d[i-1]+a[i]),最大序列和为max(d[0],...,d[n])
设sum=0,sum+=a[i]
若sum<0,则最长子序列的下标从i+1开始,并且令sum=0,这一步相当于d[i]<0,则d[i+1]=a[i+1]
下面附上ac代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
//freopen("1.txt","r",stdin);
int n,m,num;
scanf("%d",&n);
for(int k=1;k<=n;k++)
{
scanf("%d",&m);
int maxs=-1001,maxL,maxR;
int sum=0,tempL=1;
for(int i=0;i<m;i++)
{
scanf("%d",&num);
sum+=num;
if(sum>maxs)
{
maxs=sum;
maxL=tempL;
maxR=i+1;
}
if(sum<0)
{
sum=0;
tempL=i+2;
}
}
printf("Case %d:\n%d %d %d\n",k,maxs,maxL,maxR);
if(k!=n) printf("\n");
}
return 0;
}