当前位置: 首页 > backend >正文

算法题(200):最大子段和(动态规划)

审题:

 本题需要我们找到给定数组中的连续子段和最大的值

思路:
方法一:动态规划

根据经验,一般来说填表顺序都是从左到右,所以我们确定状态表示可以先以某个地方为结尾开始分析

(1)状态表示:f[i]表示以第i个元素为结尾的所有子段的最大子段和

(2)状态转移方程:

我们先将所有子段表示出来然后分析

所有子段列出来后,总共可以分为两类

第一类:只有自身的

那么它的子段和就是a[i]

第二类:和前面的元素组合起来的子段

他们可以看成前面的子段+自身,而前面的子段都是以i-1为结尾的子段,f[i-1]就是前面的子段和的最大值。所以第二类的子段中子段和的最大值一定是f[i-1]+a[i]

综上:状态转移方程为max(f[i-1]+a[i],a[i])

(3)初始化

由于我们的f[i]依赖与前一个f,所以我们为了正确填写f[1],需要初始化f[0]=0

(4)填表顺序

根据状态转移方程可知是从左到右

(5)答案输出

由于最后需要的是所有子段中的最大子段和,所以我们需要遍历f数组,维护一个最大值并输出,ret初始化为f[1]即可

解题:
 

#include<iostream>
using namespace std;
const int N = 2e5 + 10;
int f[N],a[N];//f[i]表示以第i个元素为结尾的最大子段和
int n;
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}//填表for (int i = 1; i <= n; i++){f[i] = max(f[i - 1] + a[i], a[i]);}//维护ret并输出int ret = f[1];for (int i = 1; i <= n; i++){ret = max(ret, f[i]);}cout << ret << endl;return 0;
}

P1115 最大子段和 - 洛谷

http://www.xdnf.cn/news/20351.html

相关文章:

  • 责任链框架 03:处理器实现
  • 《Science》神经炎症综述思路套用:从机制到跨领域研究范式
  • Python实现生成矩形框、三角形框、六边形框和圆环点云
  • 自动拆箱和装箱的原理与作用
  • HMI(人机界面)
  • 【基础-单选】UIAbility实例创建完成时触发的回调
  • HTML 列表类型
  • 5-8单元格区域与VS数组应用(实例:提取满足条件的数据)
  • Qt多线程编程学习
  • EG2103 SOP-8 内置600V功率MOS管 栅极驱动芯片
  • I/O 多路复用 (I/O Multiplexing)
  • 四个关于云属性的四个卫星数据集的介绍
  • 基于Spring Boot + Vue3的办公用品申领管理系统
  • 部署AIRI
  • lesson55:CSS导航组件全攻略:从基础导航条到动态三级菜单与伸缩菜单实现
  • 02.继承MonoBehaviour的单例模式基类
  • Python快速入门专业版(七):整数与浮点数:Python数值类型的运算与精度问题(附解决方案)
  • 项目中的一些比较实用的自定义控件
  • Python文件打包为EXE的工具v1.0
  • 《AI大模型应知应会100篇》第67篇 Web应用与大模型集成开发实践——1小时打造国产大模型智能客服系统
  • MySQL问题5
  • github上传步骤
  • 季度最强策略:年化247%,回撤10%,夏普比率3.79。附大小盘轮动策略python源代码。
  • Nestjs框架: 使用 CASL 库实现基于角色的权限控制(RBAC)与细粒度访问控制的实战演示
  • 【嵌入式C语言】七
  • 【IQA技术专题】 多尺度的transformer网络IQA:MUSIQ
  • GO语言的主要语法和特性
  • 跨平台游戏引擎 Axmol-2.8.1 发布
  • 突破反爬限制:动态IP轮换策略与实现
  • XXL-JOB源码分析(服务端)