浅说线性DP(上)

前言

在说线性dp之前,我们先来聊一聊动态规划是啥?

动态规划到底是啥?

动态规划是普及组内容中最难的一个部分,也是每年几乎必考的内容。它对思维的要求极高,它和图论、数据结构不同的地方在于它没有一个标准的数学表达式和明确清晰的解题方法。

动态规划是对求解最优解的一种途径,而不是一种特殊的算法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的阶梯方法,而不存在一种万能的动态规划算法。为了方便学习,我们把若干具有代表性的动态规划问题归纳总结成不同的几类,并建立对应的数学模型。

动态规划一般用来求解多阶段决策问题的最优解,可以将过程分成若干个互相联系的阶段,在它的每一阶段都需要做决策,从而使整个过程达到最好的活动效果。各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。

动态规划显示图
对于动态规划问题,最重要的是分析出:
一、决策对象:我们需要对题目中的哪个变量进行决策。
二、阶段:需要将问题的全过程恰当的分成若干个相互联系的阶段,以便按一定的次序去求解。阶段的划分一般是根据时间(先后顺序)空间(大小关系) 的自然特征来划分。
三、状态:某一阶段的出发位置称为状态,一个阶段可能包含多个状态,状态大多都是用 数组 来表示,即表示我们需要的答案。
四、决策:分析完问题后我们应该怎么解决问题。
五、状态转移方程:描述前一阶段到后一阶段的状态演变规律

线性动态规划

线性动态规划是动态规划中比较简单的一类问题,他的状态转移是线性的,即状态的转移是固定的,常见的如从前到后,或者从后到前。线性动态规划和递推比较类似,在很多情况下,这两种做法大致是相同的。一般的,递推是当前要求解的答案和前面某个固定答案有关,而线性动态规划是当前答案和前面的某个答案存在关系,这个位置在不同的情况下是不相同的。

最长上升子序列

言归正传,我们继续聊线性dp。

子集和子序列和子串的区别

a b f s g e g s a s abfsgegsas abfsgegsas为例, f a g g a s faggas faggas是它的子集,因为子集是不计顺序的, a b g g s s abggss abggss 则是他的子序列,因为子序列是要求有顺序的,而 a b f abf abf则是他的字串

内容分析

决策对象
每个位置上的数。

阶段
共有 n n n 个数,因此有 n n n 个阶段。

状态
因为每个数都有可能是子序列的结尾,所以使用 dp[i] 表示以第 i i i 个数作为结尾的最长上升子序列的长度。

决策
如果以第 i i i 个数作为结尾,那么在这个序列中,上一个数一定要小于 a [ i ] a[i] a[i]。因此,我们需要在前面的数中找到比 a [ i ] a[i] a[i] 小的数,而且我们应该选择以这个数结尾的最长上升子序列中最长的那个,这样接在这个数后面得到的序列也是最长的。

状态转移方程
如果 h [ k ] < h [ i ] h[k]<h[i] h[k]<h[i],则 d p [ i ] = m a x ( d p [ i ] , d p [ k ] + 1 ) dp[i]=max(dp[i],dp[k]+1) dp[i]=max(dp[i],dp[k]+1),其中 k ∈ [ 1 , i − 1 ] k\in[1,i-1] k[1,i1]

最后,我们找到最大的 d p [ i ] dp[i] dp[i] 就是答案。

#include<bits/stdc++.h>
using namespace std;int a[10010],dp[10010],ans=INT_MIN;
int main(){int n;cin>>n;for (int i=1;i<=n;i++){cin>>a[i];dp[i]=1;}	for (int i=1;i<=n;i++){for (int j=1;j<i;j++){if (a[j]<a[i]){dp[i]=max(dp[i],dp[j]+1);}}ans=max(ans,dp[i]);}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 01 linux 上安装mysql服务端

01.linux安装 MySQL的大部分安装包都包含了服务器程序和客户端程序&#xff0c;不过在Linux下使用RPM包时会有单独的服 务器RPM包和客户端RPM包&#xff0c;需要分别安装。 1.查看是否已经安装了MySQL rpm -qa | grep mysql如果什么都没有&#xff0c;就是还没有装过MySQL …

Vue3记录校验工具类:validata.ts

在vue文件使用&#xff1a; import { validateNull } from //utils/validata; validateNull(需要校验的数据)validata.ts文件&#xff1a; /*** 判断是否为空* param val 数据*/ export const validateNull (val: any) > {if (typeof val boolean) {return false;}if (t…

C++核心编程——4.7 多态

4.7.1 多态的基本概念 多态是C面向对象三大特性之一 多态表示提供一个公共的函数接口&#xff0c;当传入不同参数对象时&#xff0c;执行不同的函数实现。 语法 virtual 返回值类型 函数名() {} 分类 静态多态 动态多态&#xff08;加“virtual“&#xff09; 函数重载 和 …

基于Pytorch框架的深度学习RegNet神经网络二十五种宝石识别分类系统源码

第一步&#xff1a;准备数据 25种宝石数据&#xff0c;总共800张&#xff1a; { "0": "Alexandrite","1": "Almandine","2": "Benitoite","3": "Beryl Golden","4": "Carne…

数字化农业新时代:图扑农林牧综合监控平台

利用图扑自研 HT for Web GIS 产品&#xff0c;结合遥感技术&#xff0c;构建可交互式的农林牧数据分析平台。该平台围绕地块总览、播种分析、牛只管理、设备查询四个维度&#xff0c;对地区的全貌、农场、村集体分布以及相应的环境进行多样化的可视化展示和进行数据支持&#…

爱岗敬业短视频:成都科成博通文化传媒公司

爱岗敬业短视频&#xff1a;传递正能量&#xff0c;塑造职场新风尚 在当今社会&#xff0c;短视频以其独特的传播方式和广泛的受众群体&#xff0c;成为了信息传播的重要渠道。在众多短视频内容中&#xff0c;以“爱岗敬业”为主题的短视频尤为引人注目&#xff0c;成都科成博…

js Ajax函数封装及使用

直接上代码 一、ajax函数封装 /*** ajax函数* param {Object} options 请求传入的对象参数*/ function ajax(options {}) {// 1. 参数校验// 校验请求地址必传,而只能是字符串类型if (!options.url || typeof (options.url) ! string) throw Error(url必传,只能是字符串);//…

每天发布1000个视频SOP之账号管理:抖音可用的上传管理账号的浏览器安装包23个

企业抖音运营&#xff1a; 全流程整套操作SOP&#xff0c; 每天发布1000个视频工作管理体系&#xff1a; &#xff08;因为上传限制&#xff0c;分成3个压缩包资源上传&#xff09; 这是其中的&#xff1a;SOP矩阵划管理登录抖音平台账号&#xff0c;上传管理运营账号&#…

FreeRtos进阶——队列的特殊用途

信号量与互斥量都一样&#xff0c;都是特殊的队列。但是只有互斥量实现了优先级继承机制。 信号量与互斥量与队列一样&#xff0c;在操作增加或者减少时&#xff0c;必须先关中断在进行操作&#xff01; 信号量创建揭秘 图中信号量的创建过程&#xff0c;在代码中的体现本质就是…

设计模式 16 解释器模式 Interpreter Design Pattern

设计模式 16 解释器模式 Interpreter Design Pattern 1.定义 解释器模式 (Interpreter Design Pattern) 是一种行为型设计模式&#xff0c;它定义了一种语法表示&#xff0c;并提供了一种解释器来解释该语法表示的句子。 核心概念&#xff1a; 语法表示 (Grammar): 定义了…

如何使用 jQuery 库来删除 HTML 页面中指定的元素下的所有子元素,但是保留其中一个特定的子元素

如何使用 jQuery 库来删除 HTML 页面中指定的元素下的所有子元素&#xff0c;但是保留其中一个特定的子元素 示例如下&#xff1a; 假设我们有以下的 HTML 代码&#xff1a; <div id"container"><div id"header">Header</div><div…

现在股票交易佣金标准最低是万0.854,低佣金炒股开户方式和流程!

股票交易佣金的最低标准是万分之0.854&#xff1b; 证券公司股票交易佣金默认是万分之3&#xff1b; 无门槛的股票交易佣金是万分之1&#xff1b; 万分之0.854的佣金要求投资者资产达到一定规模&#xff0c;不同的证券公司规定不一样。 如果没有经过证券公司客户经理协商开…

【SQL学习进阶】从入门到高级应用(一)

文章目录 MySQL命令行基本命令数据库表的概述初始化测试数据熟悉测试数据 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f49d;希望您在这里可以感受到一份轻松愉快的氛围&#x…

SolidityFoundry 安全审计测试 tx.origin 漏洞

名称&#xff1a;tx.origin 漏洞 solidityproject/vulnerable-defi at master XuHugo/solidityproject GitHub 说明&#xff1a; tx.origin是Solidity中的一个全局变量&#xff1b;智能合约中使用该变量进行身份验证&#xff0c;会使合约容易受到网络钓鱼攻击。 msg.sende…

C++牛客周赛43题目分享(3)小红平分糖果,小红的完全平方数,小苯的字符串变化,小红的子数组排列判断

目录 ​编辑 1.前言 2.四道题目 2.1小红平分糖果 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.2小红的完全平方数 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.3小苯的字符串变化 2.1.1题目描述 2.1.2输入描述 …

Java 原子变量 一次通关

前言 Java中的原子变量是用于实现无锁的线程安全编程的一种机制。它们是java.util.concurrent.atomic包中的一部分&#xff0c;这个包提供了一系列原子类&#xff0c;用于执行原子操作。 主要类型 Java的原子包提供了多种原子类&#xff0c;包括&#xff1a; 基本类型&…

想自学编程,看编程书有些看不懂,下一步应该怎么办?

不管你从事什么工作&#xff0c;编程都有助于你的职业发展。学习编程将给你自己赋能。我喜欢尝试新想法&#xff0c;时刻都有希望启动的新项目。学会编程后&#xff0c;我就可以坐下来自己实现&#xff0c;而不需要依赖他人。 编程也会提升你在其他方面的技能。因为你熟练掌握…

对SpringBoot配置文件配置项加密原理

参考认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor - 知乎 SpringBoot 之 Jasypt 实现yml配置文件加密_-djasypt.encryptor.password-CSDN博客 【springboot】jasypt加密_jasypt.encryptor.password-CSDN博客 实现&#xff1a; 导包&#xff1a; 使…

Gitlab不允许使用ssh拉取代码的解决方案

一、起因 之前一直是用ssh进行代码拉取&#xff0c;后来公司搞网安行动&#xff0c;不允许ssh进行连接拉取代码了 因为我是用shell写了个小型的CI/CD,部署前端项目用于后端联调的&#xff0c;因此在自动部署时&#xff0c;不方便人机交互&#xff0c;所以需要自动填充账密。 …

ZLMediaKit cmake 编译 要点

# 加载自定义模块 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(ZLMediaKit LANGUAGES C CXX) # 使能 C11 set(CMAKE_CXX_STANDARD 11) ############################### SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_SYSTEM_PROCESS…