首页 > 其他分享 >最大子段和の解法

最大子段和の解法

时间:2022-11-06 10:00:36浏览次数:45  
标签:前缀 子段 int max 复杂度 解法 最大

前缀和

皆用此题
首先打出一份\(O(n^3)\)的暴力代码

for(int l = 1;l <= n; l++) 
	for(int r = l;r <= n ;r++) {
		sum=0;
		for(int k = l;k <= r;k++) 
			sum += a[k];
		ans = max(sum, ans);
	}

可发现\(k\)循环可以用前缀和浅优化一下

for(int l = 1;l <= n; l++) 
	for(int r = l;r <= n ;r++) 
		ans=max(ans, sum[r]-sum[l-1]);

\(O(n^2)\)肯定还是过不了
考虑固定右端点,此时若要最大就要让左端点的前缀和最小,这样在每一步更新一下最小的前缀和即可。

for (int i = 1; i <= n; ++i) {
    sum += a[i];//sum表示前缀和
    ans = max(ans, sum - mn);//统计答案
    mn = min(mn, sum);//取最小值
}

这样时间按复杂度就降到\(O(n)\)了

\(kandane\) 算法

枚举\(a\)数组,用\(cur\)记录当前最大值。
如果当前循环到\(i\)时\(cur\) \(<\) \(0\),那么显然\(a_i\) \(<\) \(a_i\) \(+\) \(cur\)。所以清零\(cur\),舍弃前面的所有元素从\(i\)重新开始计算。
时间复杂度\(O(n)\)

for (int i = 1; i <= n; ++i) {
	scanf("%d", &a);
	cur += a;
	ans = max(ans, cur);
	if (cur < 0) cur = 0;
}

对于环形最大子段和也可用\(kandane\)解决
这道题为例

首先对于环上的最大子段和,在长度为\(n\)的序列中,有哪些情况?
image

思路就很清晰了,\(ans\) \(=\) \(max\)\((\)最大子段,总和 \(-\) 最小子段\()\)

for(int i = 1;i <= n;i++) {
	tot += a[i];
	//最大
	sum1 += a[i];
	ans1 = max(ans1, sum1);
	if(sum1 < 0) sum1 = 0;
	//最小
	sum2 += a[i];
	ans2 = min(ans2,sum2);
	if(sum2 > 0) sum2 = 0;
}
printf("%d", max(ans1, tot - ans2));

最大子矩阵也同样。比如这道
就是把一维里的\(a_i\)看做这里每一行的一段和(用前缀和预处理)
固定矩阵的列,每一次用前述方法增加一行(就像\(a_i\))

for (int i = 1; i <= n; i++) {
     for (int j = 1; j <= n; j++) {
        cin >> a[i][j];
        a[i][j] += a[i][j - 1];
    }
}
for (int i = 0; i < n; i++)
    for (int j = i + 1; j <= n; j++) {
        int maxn = 0;
        for (int k = 1; k <= n; k++) {
            maxn += a[k][j] - a[k][i];
            ans = max(ans, maxn);
            if (ans < 0) ans = 0;
        }
    }

标签:前缀,子段,int,max,复杂度,解法,最大
From: https://www.cnblogs.com/pangtuan666/p/16858989.html

相关文章

  • 二叉树的最大宽度系列问题
    二叉树的最大宽度系列问题作者:Grey原文地址:博客园:二叉树的最大宽度系列问题CSDN:二叉树的最大宽度系列问题求树的最大宽度题目描述给你一棵二叉树的根节点root,返......
  • 十个整数找最大
    【题目名称】求最大值【题目内容】求10个整数中最大值#include<stdio.h>int main(){int i=0;int arr[]={1,2,3,4,5,6,7,8,9,10};int sz=sizeof(arr)/sizeof(arr[0]......
  • 使用递归获取数组最大值。(有图)
    packageclass03;importjava.util.Arrays;/***使用递归获取数组最大值*只是用这个获取数组最大值的例子,来理解递归。*/publicclassCode08_GetMax{p......
  • P3376 【模板】网络最大流(EK)
    #include<iostream>#include<queue>#include<cstring>usingnamespacestd;constlonglongN=5e3+1;longlongh[N],to[N<<1],nt[N<<1],fro......
  • 最大子段和问题及变式
    最大子段和问题及变式题解Lim:除T8,T9外所有题目的\(a_i\)均可能为负,所有题目的\(a_i\)均为整数T1P1115最大子段和Tag:线性dp/单调队优线性dp/分治,递归......
  • RecycleView根据内容自适应高度,最大高度限制
    前言recylceView日常开发经常使用到,默认高度自适应,如何增加最大高度限制如下:publicclassMeasureLinearLayoutManagerextendsLinearLayoutManager{privateintmax......
  • 人生最大的投资是自己
    这个世界上最大的秘密之一,人是需要反馈的一种动物,有了反馈,我们就可以不断自我修正,不断前行,甚至成“神”!投资世界里有三种人:投资人、股民和普通人。木子看过一篇文章,说人生......
  • 【JS基础】关于JS能表示的最大精度的问题
    看了好多文章,我还是比较认可这位博主的说法:https://www.codercto.com/a/107226.html本文只是自己做记录,是篇水文,大家可以直接访问上面链接哦~根据 IEEE754 标准,有......
  • 1668. 最大重复子字符串
    1668.最大重复子字符串方法一:暴力枚举classSolution{publicintmaxRepeating(Stringsequence,Stringword){char[]ch1=sequence.toCharArray();......
  • 最大似然估计和均方误差到底是什么关系
    在学习机器学习的时候,我对这两个概念产生了强烈的迷惑。于是补习了相关的知识。首先给出结论:“根据中心极限定理,误差服从正态分布,此时使得样本似然函数最大等价于使得MSE......