zoukankan      html  css  js  c++  java
  • (环上)最大子段和

    1.背景

    最大连续子段和是一类问题,即求一个序列最大连续子序列的和。

    问:给出n个元素分别为A1,A2,...,An,求出其最大连续子段和。

    2.求解思路

    2.1 动态规划:

    设A[ i ]为该序列第 i 个元素,C[ i ]存放前 i 个序列的最大子段和,那么C[ i ]有两种可能结果:

    2.2 问题2:A1,A2,...,An 首尾相连,求出该环上最大子段和。

    2.3 问题2解题思路:

    • 如果子序列的最大和在 1 到 n 的范围内,直接输出最大和即可
    • 如果子序列的最大和横跨了尾部和头部,则先求出连续的最小子序列和然后用总和减去最小子串和就是最大子串和

    2.4 问题2代码示例:

    #include<cstdio>
    #include<algorithm> 
    using namespace std;
    
    const int maxn = 2e5+10;
    const int INF = 0x3f3f3f3f;
    int a[maxn];
    typedef long long ll;
    ll sum[maxn],minsum[maxn];
    int main(){
    	int n;
    	ll s = 0;
    	scanf("%d",&n);
    	for(int i = 0;i < n;i++) scanf("%d",a+i),s += a[i];
    	minsum[0] = sum[0] = a[0];
    	for(int i = 1;i < n;i++){
    		sum[i] = max(sum[i-1]+a[i],(ll)a[i]);
    		minsum[i] = min(minsum[i-1]+a[i],(ll)a[i]);
    	}
    	ll mx = -INF,mi = INF;
    	for(int i = 0;i < n;i++){
    		mx = max(mx,sum[i]);
    		mi = min(mi,minsum[i]);
    	}
    	ll ans = max(s-mi,mx);
    	printf("%lld
    ",ans);
    	return 0;
    }
  • 相关阅读:
    JS 原型模式 工厂模式 构造函数的区别
    JS 深入1
    理解DOM的一个例子
    Fuzzing参数
    神经网络相关知识和概念整理
    [转载] 系统、模型和仿真
    frp内网穿透,从外网访问内网资源
    常用软件配置
    141. 环形链表
    501. 二叉搜索树中的众数
  • 原文地址:https://www.cnblogs.com/long98/p/10352145.html
Copyright © 2011-2022 走看看