题解 P2642 【双子序列最大和】

前言

其实这道题的关键就是在于预处理,其方法类似于 合唱队形

正文

求最大子段和

要想求出双子序列最大和,首先我们要会求出最大子段和

最大子段和的求值方法很简单

定义 \(f_i\) 为以第 \(i\) 个数结尾的最大子段和

#include <bits/stdc++.h>
using namespace std;
int f[1000010],a[1000010];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    f[1]=a[1];
    for(int i=2;i<=n;i++)f[i]=max(f[i-1]+a[i],a[i]);
    int ans=f[1];
    for(int i=2;i<=n;i++)ans=max(ans,f[i]);
    cout<<ans;
    return 0;
}

求双子序列最大和

那么我们现在可以去求双子序列最大和

怎么求,思路是

如果你去枚举中间的数,然后去算左边的最大子段,再算出右边的最大子段,加起来,用打擂法,求出最大值,你会 \(TLE\),毕竟\(n<=10^{6}\)

那怎么办?我们可以预处理

我们可以用 \(O(n)\) 的时间计算到前 \(1\) 个数的最大子段,

我们可以用 \(O(n)\) 的时间计算到后 \(i\) 个数的最大子段

像这样

cin>>n;
for(int i=1;i<=n;i++)cin>>x[i];
f[1]=x[1];
for(int i=2;i<=n;i++)f[i]=max(f[i-1]+x[i],x[i]);//算最大子段
for(int i=2;i<=n;i++)f[i]=max(f[i-1],f[i]);//更新成最大值
l[n]=x[n];
for(int i=n-1;i>=1;i--)l[i]=max(l[i+1]+x[i],x[i]);//算最大子段
for(int i=n-1;i>=1;i--)l[i]=max(l[i+1],l[i]);//更新成最大值

这里 \(f_i\) 表示前 \(i\) 个数中的最大字段和

这里 \(l_i\) 表示后 \(i\) 个数中的最大字段和

然后,用 \(O(n)\) 的时间去枚举中间的数,打擂法求出双子序列最大和

上代码:

#include<bits/stdc++.h>
using namespace std;
long long x[1000010],f[1000010],l[1000010];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>x[i];
    f[1]=x[1];
    for(int i=2;i<=n;i++)f[i]=max(f[i-1]+x[i],x[i]);//算最大子段
    for(int i=2;i<=n;i++)f[i]=max(f[i-1],f[i]);//算最大子段
    l[n]=x[n];
    for(int i=n-1;i>=1;i--)l[i]=max(l[i+1]+x[i],x[i]);//算最大子段
    for(int i=n-1;i>=1;i--)l[i]=max(l[i+1],l[i]);//算最大子段
    long long ans=f[1]+l[3];
    for(int i=3;i<n;i++)ans=max(ans,f[i-1]+l[i+1]);//枚举中间数
    cout<<ans;
    return 0;
}

后记

这种预处理的方法可以优化我们的时间复杂度,避免重复计算,使我们的程序跑得更快!

原文地址:https://www.cnblogs.com/zhaohaikun/p/12326671.html

时间: 2024-08-29 11:52:03

题解 P2642 【双子序列最大和】的相关文章

BZOJ1798题解 Seq维护序列题解 双tag裸线段树

BZOJ1798题解 Seq维护序列题解 双tag裸线段树 1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5549  Solved: 1951[Submit][Status][Discuss] Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)

[算法练习]序列最大和

题目说明: 输入一个数列(包含正负数),求和是最大的连续子序列.例如{5,-3,4,2}的最大子序列就是 {5,-3,4,2}. 程序代码: #include <gtest/gtest.h> using namespace std; int MaxSumOfSequence(int* pData, int nLength, int& nBegin, int& nEnd) { if (!pData || !nLength) { return 0; } int nMaxSum =

子序列最大和

问题描述: x[i]中,从任意一个数x[a]到x[b](a<=b)的连续的序列叫做x[i]的子序列, x[i]的子序列的和叫做x[i]的子序列的序列和. 现在已知序列x[i],求一些关于最大序列和的问题答案. 一.子序列最大和 [方法一] 朴素的查找,利用S[i]=S[0]+…+S[i] 进行一次O(n^2)的查找,并比较S[i]-S[j](i>j) 求得最大值,即为答案 [代码] 略 [适用范围] 需要直观地了解最大序列和的起止位置 [方法二]见补充[需要求序列位置][分治] [方法三][不

ZLXOI2015Day1劣质题解

虐狗大赛: 本来想让搞线段树和差分序列,结果数据太水暴力都能过 算了反正第一题就简单点吧 观察到询问很少,所以我们只需简化修改的时间复杂度 用另一棵线段树维护每个单身狗受攻击的次数 把减少攻击等价于增加生命即可,设次数为di,攻击为Ai,防御为Bi 则答案为Ai-Bi*di,这样做单次修改复杂度O(logn) 同时也由于询问很少,可以用差分序列代替线段树,单次时间复杂度O(1) 殉国: 题目大意:Ax+By=C,x>=0,y>=0,求x+y最大值,x+y最小值 x,y的解得个数 暴力算法1:枚

最长子序列问题 最详细的解题报告

最长子序列之和问题 算法一:暴力法(时间复杂度:O(N^2)) 算法描述:依次求从j到i中最大的和,并将最大的和记录在maxValue中,容易理解但是效率低. 1 static int MaxSum1(int[] arr) { 2 int maxValue = Integer.MIN_VALUE; 3 for (int i = 0; i < arr.length; i++) { 4 int curSum = 0; 5 for (int j = 0; j <= i; j++) { 6 curSu

OpenJudge 由中根顺序和后根序列重建二叉树

[题解] 后根序列的最后一个元素即为二叉树的树根root.root将中根序列分为两部分,左半边是左子树的中根序列,而右半边则是右部分的中根序列.同时后根序列依照左子树和右子树节点数也可以被分为左子树的后根序列和右子树的后根序列.于是便可依此递归地按左右子树的后根.中根序列重建子树,最终重建二叉树. [代码] 1 #include <iostream> 2 using namespace std; 3 /*build BT from its inorder and postorder*/ 4 5

HDU1003 Max Sum 解题报告

目录 题目信息 Problem Description Input Output Sample Input Sample Output 题解 思路 源代码 题目信息 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in

[BZOJ4026]dC Loves Number Theory

试题描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n)代表1~n 中与n互质的数的个数) .由于答案可能很大,所以请对答案 mod 10^6 + 777. (本题强制在线,所有询问操作的l,r都需要 xor上一次询问的答案 lastans,初始时,lastans = 0) 输入 第一行,两个正整数,N,Q,表示序列的长度和询问的个数. 第二行有N 个正

hdu 1364(差分约束)

King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12056   Accepted: 4397 Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen prayed: ``If my child was a son and if only he was a sound kin