题目:HDU 1003 Max Sum
题目大意: 求序列中最大连续子序列和,并输出子序列的起始点。
思路: 设定一个 数组dp[i] 表示以a[i]结尾的最大连续子序列和 (和上一篇最大上升子序列和样一样,以a[i]结尾是强制要求)
- 对a[i]的处理是,dp[i]=max(dp[i-1]+a[i],a[i])
int max_sum(int seq[],int n)
{
dp[0]=0;
int mmax=-INF;
for(int i=1;i<=n;i++)
{
dp[i]=max(dp[i-1]+seq[i],seq[i]);
mmax=max(mmax,dp[i]);
}
return nmax;
}
- 对起点,我是设的一个数pos1表示可能的新的起点,每当dp[i-1]+seq[i]<seq[i],即当前数自己作为一个子序列的结果更优时,那么i这个点可能就是新的起点。若运行到后面发现存在dp[i]大于之前最大子序列和就更新起始点。终点肯定就是此时的i点啦。
#include <iostream>
#include <iostream>
#include <string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int manx=1e5+10;
const int INF=1e9;
int main()
{
int T,n,seq[manx],dp[manx];
scanf("%d",&T);
for(int l=1; l<=T; l++)
{
int mmax=-1e9,pos=1,pos1=1,p=1;
scanf("%d",&n);
dp[0]=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&seq[i]);
dp[i]=max(dp[i-1]+seq[i],seq[i]);
if(dp[i-1]+seq[i]<seq[i])
p=i;
if(mmax<dp[i])
{
mmax=dp[i];
pos1=p;
pos=i;
}
}
printf("Case %d:\n",l);
printf("%d %d %d\n",mmax,pos1,pos);
if(l!=T)
printf("\n");
}
}