水题 连续子序列和的绝对值最大

今天遇到一个题目,发现想了很久。这样的情况应该更加引起重视,简单基础题都不能很快做出,以后还是要补一补DP基础,一直都不怎么顺手。

给定一个数组,求所有的子数组中,和的绝对值最大值。

分析:

利用前缀和算出每一段的和a[i....j]为sum[j]-sum[i-1],那么和的绝对值最大值,sum[i]的正值最大值和负值最小值,然后利用这两个值不断更新。

代码:

 1 #include <bits/stdc++.h>
 2 #define bug(x) printf("%d\n", (x));
 3 #define pb push_back
 4 #define inf 0x0f0f0f0f
 5 #define in freopen("solve_in.txt", "r", stdin);
 6 using namespace std;
 7 typedef long long LL;
 8 
 9 const int maxn = (int)1e5 + 100;
10 
11 LL sum[maxn];
12 int main(){
13     int n;
14     while(scanf("%d", &n) == 1){
15         LL ans = -inf, mx, mi;
16         mx = 0, mi = 0;
17         int u;
18         for(int i = 1; i <= n; i++) scanf("%d", &u), sum[i] = sum[i-1]+u;
19         for(int i = 1; i <= n; i++){
20             ans = max(ans, abs(sum[i]-mx));
21             ans = max(ans, abs(sum[i]-mi));
22             mx = max(sum[i], mx);
23             mi = min(sum[i], mi);
24         }
25         cout<<ans<<endl;
26     }
27     return 0;
28 }
View Code

 

你可能感兴趣的:(序列)