题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231
最大连续子序列Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 39629 Accepted Submission(s): 17975 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Input 测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。 Output 对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
|
代码实现
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[10005];
int a[10005];
int main(){
int n,m;
int ans;
while(scanf("%d",&n)!=EOF&&n!=0){
//bool flag=true;
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);//最大连续子序列和(输出首尾元素)HDU 1231
}
dp[1]=a[1];
ans=dp[1];
m=1;
for(int i=2;i<=n;i++){
dp[i]=max(a[i],dp[i-1]+a[i]);
if(dp[i]>ans){
ans=dp[i];
m=i;
}
}
if(ans<0){
printf("0 %d %d\n",a[1],a[n]);
}
else{
if(n==1)
printf("%d %d %d\n",ans,ans,ans);
else{
int s=0;
for(int i=m;i>=1;i--){
s=a[i]+s;
if(s==ans){
printf("%d %d %d\n",ans,a[i],a[m]);
break;
}
}
}
}
}
return 0;
}