水题 连续子序列和的绝对值最大
今天遇到一个题目,发现想了很久。这样的情况应该更加引起重视,简单基础题都不能很快做出,以后还是要补一补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 }
 
                    
                     
                    
                 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
