以hdu 1231为例
题意就是求所有连续子序列中元素和最大的一个,即最大连续子序列,输出它的和、第一个和最后一个元素
很简单的一道题,不过我还是理解了很久
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define MAXK 10002
int a[MAXK],dp[MAXK],start[MAXK];
int main()
{
int k,i;
while(~scanf("%d",&k))
{
if(k==0) break;
int flag = 0;
for( i = 0; i < k; i++)
{
scanf("%d",&a[i]);
if(a[i]>=0) flag=1;
}
if(!flag)
{
printf("0 %d %d\n",a[0],a[k-1]);
}
else
{
dp[0] = a[0];
start[0] = a[0];
for(i = 1; i < k; i++)
{
if(dp[i-1] + a[i] > a[i])
{
dp[i] = dp[i-1] + a[i];
start[i] = start[i-1];
}
else{
dp[i] = a[i];
start[i] = a[i];
}
}
int sum = dp[0];
int pos = 0;
for(i =1; i < k; i++)
{
if( dp[i] > sum)
{
sum = dp[i];
pos = i;
}
}
printf("%d %d %d\n",sum,start[pos],a[pos]);
}
}
return 0;
}