1305:Maximum sum

2024-01-04 17:28
文章标签 maximum sum 1305

本文主要是介绍1305:Maximum sum,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【算法分析】
 动态规划:线性动规
要在整个序列中取两个不重合的子段,分别记为子段1与子段2,记子段2的起始位置为i 。
以i 为分界线,将整个序列分为两部分,分别为下标1 ∼ i − 1 与下标i ∼ n。

  • 子段1存在于下标1 ∼ i − 1范围内,子段1的和应该最大,即为所有满足j < i的j 中,以j 为结尾的最大子段和。
  • 子段2以i 起始,子段2的和应该最大,所以子段2应该为以i 为起始的最大子段和。

基于上述思路,应该先分别求以i为结尾以及以i为起始的最大子段和
记a[i]为第i个元素

1. 求以i为结尾的最大子段和
状态定义:dp1[i]:以i为结尾的最大子段和
状态转移方程:
分割集合:以i为结尾的子段
子集1:以i-1为结尾的子段,添加第i元素,构成以i为结尾的子段。该子段的和为dp1[i]=dp1[i-1]+a[i]
子集2:第i元素自己构成子段,子段和为:dp1[i]=a[i]
以上两种情况取最大值

2. 求以i为起始的最大子段和
状态定义:dp2[i]:以i为起始的最大子段和
状态转移方程:
分割集合:以i为起始的子段
子集1:以i+1为起始的子段,添加第i元素,构成以i为起始的子段。该子段的和为dp2[i]=dp2[i+1]+a[i]
子集2:第i元素自己构成子段,子段和为:dp2[i]=a[i]
以上两种情况取最大值
注意,求该状态时,下标从大到小遍历

3 求互不重叠的两个最大子段和的最大加和
i 从2循环到n 
以i 为分界线,将整个序列分为两部分,分别为下标1 ∼ i − 1 与下标i ∼ n 。
设mx表示:满足1 ≤ j < i 的以j 为结尾的最大子段和dp1[j]中的最大值。i 每次增大1后,第一段取到的新元素的下标为i − 1。更新mx,写法为mx = max(mx, dp1[i-1])
以i为起始的最大子段和为dp2[i]
mx + dp2[i]为以i 为子段2的起始位置时能取到的最大的互不重叠的两个子段的加和。
在循环中求这个表达式求最大值,即为结果。

【参考代码】

#include <bits/stdc++.h>
using namespace std;
#define N 50005
#define INF 0x3f3f3f3f //0x3f3f3f3f表示无穷大或极大值
int dp1[N], dp2[N], a[N];//dp1[i]:以i为末尾的子段的最大和 dp2[i]:以i为起始的子段的最大和
int main()
{int t, n;cin >> t;while(t--){memset(dp1, 0, sizeof(dp1));memset(dp2, 0, sizeof(dp2)); cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= n; ++i)dp1[i] = max(dp1[i-1]+a[i], a[i]);for(int i = n; i >= 1; --i)dp2[i] = max(dp2[i+1]+a[i], a[i]);int mx = -INF, ans = -INF;//mx:1~i-1中最大子段和 ans:结果 两个不重合的子段的最大和 for(int i = 2; i <= n; ++i)//求1~i-1中最大子段和 与 以i开始的最大子串和 的加和的最大值{mx = max(mx, dp1[i-1]);ans = max(ans, mx + dp2[i]);}cout << ans << endl;}return 0;
}

这篇关于1305:Maximum sum的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570054

相关文章

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

如何导入sun.misc.BASE64Encoder和sum.misc.BASE64Decoder

右击项目名--->Build Path--->Configure Build Path...--->java Build Path--->Access rules:1 rule defined,added to all librar...   --->Edit --->Add...

leetcode#628. Maximum Product of Three Numbers

题目 Given an integer array, find three numbers whose product is maximum and output the maximum product. Example 1: Input: [1,2,3]Output: 6 Example 2: Input: [1,2,3,4]Output: 24 Note: The lengt

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

apt-get update更新源时,出现“Hash Sum mismatch”问题

转载自:apt-get update更新源时,出现“Hash Sum mismatch”问题 当使用apt-get update更新源时,出现下面“Hash Sum mismatch”的报错,具体如下: root@localhost:~# apt-get update ...... ...... W: Failed to fetch http://us.archive.ubuntu.com/ub

Maximum likelihood function maximizes what thing?

最大似然函数(Maximum Likelihood Function)最大化的是数据在给定参数下出现的概率。具体来说,它最大化的是似然函数(Likelihood Function),即给定参数 ( \theta ) 下观测数据的概率。在统计学中,似然函数 ( L(\theta) ) 通常定义为所有独立观测数据点概率的乘积,对于参数 ( \theta ) 的函数。 对于一组独立同分布的观测数据

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

[LeetCode] 239. Sliding Window Maximum

题:https://leetcode.com/problems/sliding-window-maximum/description/ 题目 Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You

[LeetCode] 303. Range Sum Query - Immutable

题:https://leetcode.com/problems/range-sum-query-immutable/description/ 题目 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums

[LeetCode] 64. Minimum Path Sum

题:https://leetcode.com/problems/minimum-path-sum/description/ 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers