【题目链接】

洛谷 P1115 最大子段和

【题目考点】

1. 动态规划:线性动规

  • 最大子段和

【解题思路】

解法1:线性动规

子段或子串指的是序列中连续的多个元素,子序列是指序列中可以不连续的多个元素。

1. 状态定义

集合:所有子段
限制:子段所在区间范围
属性:加和
条件:最大
统计量:加和
状态定义dp[i]为以i为结尾的加和最大的子段的加和。

2. 状态转移方程

a[i]为第i个元素的值
分割集合:考虑以第i元素为结尾的子段

  • 子集1:第i元素自己作为一个子段,dp[i] = a[i]
  • 子集2:如果第i元素和其左边一些元素构成子段,那么第i元素左边的子段为以第i-1元素为结尾的子段,以第i-1元素为结尾的子段中加和最大的子段的加和为dp[i-1],在这个子段后面添加第i元素,这个以i为结尾的子段加和为dp[i]=dp[i-1]+a[i]

以上二者取最大值。

3. 结果输出

题目要求的是最大子段和,就是以每个位置为结尾的最大子段和中的最大值,即为求dp数组的最大值。

解法2:前缀和

求出原序列的前缀和,保存在s数组中。s[i]表示前i个数的和。
最大子段和即为:满足j>is[j]-s[i]的最大值。
mi为数组s在下标1~i中的最小值。那么s[i]-mi即为以i为结尾的子段的最大子段和。
最大子段和为以每个位置为结尾的最大子段和中的最大值。
i从1循环到n,不断更新mi,保持mi为s[1]~s[i]中的最小值,求s[i]-mi的最大值。

解法3:双指针

顺序遍历数组,当前已经选择了以第i-1元素为结尾的子段,该子段和为s,看是否把第i个元素a[i]加入到子段中。

  • 如果已有子段的和为负数,即s<0,那么s+a[i] < a[i],也就是说第i元素自己作为一个子段的加和,要比将其接到前一个子段的末尾构成的子段的加和要大。所以此时子段和应该从s变为a[i]
  • 如果已有的子段和大于等于0, 即s>=0,那么s+a[i] >= a[i],应该将第i元素接到前一个子段的末尾,构成以第i元素为结尾的子段,子段和从s变为s+a[i]

在遍历过程中,求所有出现的子段和的最大值。

该算法实际是一种双指针(尺取法)算法,子段的第一个元素的下标为l,最后一个元素的下标为r,当前子段和为负数,则l改变,否则r改变。这里思考时借助了双指针的思想,但代码中并不需要写出双指针。

【题解代码】

解法1:线性动规

#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f
int a[N], dp[N];//dp[i]:以i为结尾的加和最大的子段的加和
int main()
{int n, mx = -INF;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= n; ++i)dp[i] = max(a[i], a[i] + dp[i-1]);for(int i = 1; i <= n; ++i)mx = max(mx, dp[i]);cout << mx;return 0;
}

解法2:前缀和

#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f
int a[N], s[N];
int main()
{int n, mi = 0, mxSum = -INF;cin >> n;for(int i = 1; i <= n; ++i){cin >> a[i];s[i] = s[i-1] + a[i];}for(int i = 1; i <= n; ++i){mxSum = max(mxSum, s[i] - mi);mi = min(mi, s[i]);}cout << mxSum;return 0;
}

解法3:双指针

#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f
int a[N], s;
int main()
{int n, mi = 0, mxSum = -INF;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= n; ++i){if(s < 0)s = a[i];elses += a[i];mxSum = max(mxSum, s);}cout << mxSum;return 0;
}

洛谷 P1115 最大子段和相关推荐

  1. 洛谷p1115 最大子段和

    题目链接:https://www.luogu.org/problem/P1115 线段树求最大子段和 #include<iostream> #include<cstdio> # ...

  2. (Java实现) 洛谷 P1115 最大子段和

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iA ...

  3. 洛谷P1115最大子段和题解

    这道题应该用dp才对,但是发现全部TLE(dp不是以快著称吗)-- 来看看,一股浓郁的前缀和气味,上面说一段,并且还说和,前缀和就是用来求某一个区间中元素的和的啊!! 立马写一个: #include ...

  4. 动态规划——最大子段和(洛谷 P1115)

    题目选择洛谷P1115 经典的动态规划基础题目,最大连续子序列和 状态转移方程为: dp[i] = max{A[i],dp[i-1]+A[i]} 题目描述 给出一个长度为 n 的序列 a,选出其中连续 ...

  5. AC日记——最大子段和 洛谷 P1115

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...

  6. 洛谷——1115 最大子段和(区间DP)

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...

  7. 贪心 or 动态规划 求解“最大字段和”问题(洛谷P1115题题解,Java语言描述)

    题目要求 P1115题目链接 分析 练习DP,势在必行! 状态转移方程:f[i]=max(f[i−1]+n[i],n[i])f[i]=max(f[i-1]+n[i], n[i])f[i]=max(f[ ...

  8. 洛谷 1115——最大子段和(线性数据结构)

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...

  9. P1115 最大子段和(python3实现)

    最大子段和 - 洛谷 """P1115 最大子段和(python3实现) https://www.luogu.com.cn/problem/P1115"&quo ...

最新文章

  1. 内存按字节编址,地址从A4000H到CBFFFH,共有多少个字节呢?
  2. 在肚子上开个通到胃大洞,牛瘤胃微生物组是这样研究的
  3. iOS开发UI篇—简单介绍静态单元格的使用
  4. CTP综合交易平台-开发后感
  5. java+JBroFuzz对restful api进行fuzz测试
  6. imitativesimulate
  7. Exchange2007 申请安装证书
  8. 一个获取a标签传值的函数
  9. 阶级斗争的作用_21世纪的阶级斗争
  10. Victor and World(spfa+状态压缩dp)
  11. 做了一个阿里云MQTT单片机编程小工具
  12. 20155327结对编程练习
  13. Java零基础学习(三)封装继承多态
  14. Effective_STL 学习笔记(三) 使容器里对象的拷贝操作轻量而正确
  15. ffmpeg time_base详解
  16. [Autohotkey]获取当前运行的脚本pid与完整路径
  17. 使用sklearn出现错误:ValueError: Expected 2D array, got 1D array instead 解决方法
  18. windows系统配置静态路由
  19. 谷歌邮箱lmap服务器填什么_GMAIL邮箱IMAP设置
  20. 为什么利率上升,债券价格下降?

热门文章

  1. java程序打包成jar
  2. CAD输出的局部平面坐标数据配准转换到WGS84坐标系
  3. sharepoint数据库连接
  4. python orm_python的orm
  5. 凭实力搞砸公司重大项目,老板看到直呼内行
  6. 阿里合伙人程立:阿里15年,我撕掉了身上两个标签
  7. GitHub 有望在中国开设子公司?
  8. 【JEECG技术文档】表单配置-树形表单
  9. 我们的开源项目-2013年度开源社区线下聚会《JEECG微云快速开发平台-SAAS企业应用在线开发与微信移动应用》PPT分享
  10. 自动化集成:Docker容器入门简介