0%

最大连续子序列

动态规划入门题…

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1231
题意: 给一个整数序列,求出这个序列的最大连续子序列,并输出它的开头元素和末尾元素,如果最大连续子序列小于0,则默认最大连续子序列为0,并输出序列首尾元素。
想法有很多,分享一下动态规划做法。
AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=1e5+5;
int k;
int a[MAX_N];
int dp[MAX_N];

void solve(){
int first=0,last=0;
int temp=0;
int res;
for(int i=0;i<k;i++){
scanf("%d",&a[i]);
dp[i]=a[i];
}
res=dp[0];
for(int i=1;i<k;i++){
//dp[i]=max(dp[i-1]+a[i],a[i]);
//res=max(dp[i],res);
if(dp[i-1]+a[i]<a[i]){
dp[i]=a[i];
temp=i;
}
else{
dp[i]=dp[i-1]+a[i];
}
if(res<dp[i]){
res=dp[i];
first=temp;
last=i;
}
}
if(res<0){
first=0;
last=k-1;
res=0;
}
printf("%d %d %d\n",res,a[first],a[last]);
}

int main()
{
while(scanf("%d",&k)!=EOF&&k){
solve();
}
return 0;
}

-------------本文结束感谢您的阅读-------------