码迷,mamicode.com
首页 > 其他好文 > 详细

HDU-1231 最大连续子序列

时间:2019-03-10 20:44:55      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:div   style   amp   代码   cout   ima   序列   ref   img   

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231

思路:在求最大连续子列和的同时更新左右端点即可,要注意序列最大值不为正数的情况,因为cur和maxn的初值为0

代码:

 1 #include<bits/stdc++.h>
 2 #define inf 0x3f3f3f3f
 3 typedef long long ll;
 4 const int M = int(1e5) * 2 + 5;
 5 using namespace std;
 6 int a[M];
 7 struct sta
 8 {
 9     int sum;
10     int l, r;
11 };
12 sta cur, maxn;
13 int flag;
14 int main()
15 {
16     int k; 
17     while (cin >> k && k)
18     {
19         for (int i = 1; i <= k; i++) cin >> a[i];
20         cur.sum = maxn.sum = -inf;
21         cur.l = cur.r = maxn.l = maxn.r = 1;
22         flag = -inf;
23         for (int i = 1; i <= k; i++)
24         {
25             flag = max(flag, a[i]);
26             cur.sum += a[i]; cur.r=i;
27             if (cur.sum > maxn.sum)
28             {
29                 maxn = cur;
30             }
31             else if (cur.sum < 0)
32             {
33                 cur.sum = 0;
34                 cur.l = cur.r = i + 1;
35             }
36             //cout << " " << cur.sum << " " << maxn.sum << " " <<maxn.l<<" "<<maxn.r<< endl;
37         }
38         if (flag<0) cout << 0 << " " << a[1] << " " << a[k] << endl;
39         else if (!flag) cout << 0 << " " << 0 << " " << 0 << endl;
40         else cout << maxn.sum << " " << a[maxn.l] << " " << a[maxn.r] << endl;
41     }
42     return 0;
43 }

备注:求最大子列和是一个很经典的算法,采用在线处理可以使复杂度降到线性,具体可见百度百科

技术图片

HDU-1231 最大连续子序列

标签:div   style   amp   代码   cout   ima   序列   ref   img   

原文地址:https://www.cnblogs.com/harutomimori/p/10506726.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!