设有一个序列(a1,a2,a3,a4…….,ak)最长连续子序列肯定是以其中一个ai结尾,所以我们就把每一个以ai(i=1,2,3,4…..,k)结尾的最长连续子序列计算出来,最后我们for循环从1到k枚举dp【i】,(这里dp[i]是指以a[i]结尾的最长连续子序列和)就可以得出最长连续子序列的和了,求解dp[i]的递推公式,dp[i]=max(dp[i-1]+num[i],num[i]);以hdu1213为例
#include<stdio.h>
#define maxn 10000+5
int dp[maxn],num[maxn];
int max(int a,int b)
{
if(a>=b)
return a;
if(a<b)
return b;
}
int main()
{
int k,i;
while(scanf("%d",&k)==1&&k)
{
int flag=0,head,tail,temp,maxnum;
for(i=1;i<=k;i++)
{
scanf("%d",&num[i]);
if(num[i]>=0)
flag=1;
}
if(!flag)//判断输入是否都是负数
{
printf("%d %d %d\n",0,num[1],num[k]);
continue;
}
dp[1]=num[1];
if(k==1)//输入只有一个元素的情况
{
printf("%d %d %d\n",dp[1],dp[1],dp[1]);
continue;
}
for(i=2;i<=k;i++)
dp[i]=max(dp[i-1]+num[i],num[i]);
maxnum=dp[1];
for(i=2;i<=k;i++)
if(dp[i]>maxnum)
{
maxnum=dp[i];
tail=i;
}
int maxi=maxnum;
for(i=tail;i>=1;i--)
{
maxi-=num[i];
if(maxi==0)
{
head=i;
break;
}
}
printf("%d %d %d\n",maxnum,num[head],num[tail]);
}
return 0;
}