首页 > 其他分享 >学习笔记:基础动态规划

学习笔记:基础动态规划

时间:2024-08-28 10:52:32浏览次数:6  
标签:int max 笔记 线性 序列 动态 规划 最长

线性 DP

定义

具有线性“阶段”划分的动态规划算法被统称为线性动态规划

入门线性动态 DP

LIS 问题

最长上升子序列问题。
问题:给定一个长度为 \(N\) 的数列 \(A\), 求数值单调递增的子序列的长度最长是多少(子序列不需要连续)。
经典的线性动态规划问题。
分析:容易发现,对于某一个位置 \(i\),其所处的最长上升子序列一定是 \(i\) 前面的最后一位小于 \(A_i\) 的最长的上升子序列。
状态:定义 \(f_i\) 表示以 \(A_i\) 为结尾的"最长上升子序列"的长度。
阶段划分:子序列的结尾的位置(从前往后,这明显是线性的)。
状态转移方程:$$f_i = max_{0 \leq j \lt i, A_j \lt A_i}(f_j + 1)$$
初始化:\(f_0 = 0\)。
答案:\(max_{1 \leq i \leq N}(f_i)\)。
时间复杂度:\(O(N^2)\)。
LIS 问题有 \(O(N \log N)\) 的做法,不过与 dp 关系不大。

点击查看代码
#include <iostream>
#include <cstdio>

using namespace std;

const int N = 1e5 + 5;

int N, A[N], f[N], ans;

int main() {
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) scanf("%d", &A[i]);
    for (int i = 1; i <= N; i++) 
        for (int j = 0; j < i; j++) 
            if (A[i] > A[j]) f[i] = max(f[i], f[j] + 1);
    for (int i = 1; i <= N; i++) ans = max(ans, f[i]);
    printf("%d", ans);
    return 0;
}

参考资料

《算法竞赛进阶指南》 李煜东

标签:int,max,笔记,线性,序列,动态,规划,最长
From: https://www.cnblogs.com/FRZ29/p/18384171

相关文章

  • 使用FastAPI来开发项目,项目的目录结构如何规划的一些参考和基类封装的一些处理
    使用FastAPI开发项目时,良好的目录结构可以帮助你更好地组织代码,提高可维护性和扩展性。同样,对基类的封装,也可以进一步减少开发代码,提供便利,并减少出错的几率。下面是一个推荐的目录结构示例:my_fastapi_project/├──app/│├──__init__.py│├──main.py......
  • 代码随想录训练营 Day42打卡 动态规划 part09 188.买卖股票的最佳时机IV 309. 最佳买
    代码随想录训练营Day42打卡动态规划part09一、力扣188.买卖股票的最佳时机IV给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次......
  • Java学习笔记9-数据类型的转化
    一.显示转化在Java中,数据类型的转换主要分为两种:自动类型转换(也称为隐式类型转换)和强制类型转换(也称为显式类型转换)。1.自动类型转换(隐式类型转换)自动类型转换是指在赋值或运算过程中,较小的数据类型自动转换为较大的数据类型。Java编译器会自动进行这种转换,不需要程序员显式指......
  • Java学习笔记10-运算符
    Java运算符是用于执行各种数学、逻辑和位运算的符号。Java中的运算符可以分为以下几类:一、算术运算符用于执行基本的数学运算,如加、减、乘、除和取模。常用的算术运算符包括+、-、*、/和%。算数运算符详解Java中的算术运算符包括加、减、乘、除、取模等,下面分别详细介绍。1.1......
  • Datawhale AI夏令营 Task 1 《深度学习详解》 - 1.1 通过案例了解机器学习的学
        一、学习目标通过具体案例深入理解机器学习的概念、工作原理以及在实际应用中的作用。二、主要内容案例介绍:详细阐述了图像识别、语音识别、自然语言处理等领域的具体案例,如人脸识别系统、智能语音助手、文本......
  • C:回调函数的介绍-学习笔记
    前言:本篇文章我们将继续指针相关知识:回调函数希望大家在看完后能够有所收获!回调函数 定义与概念回调函数是一个通过指针调用的函数。如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是有该函数的实现方......
  • HCIP笔记10-MPLS(1)
    MPLS:多协议标签交换多协议:可以基于多种不同的3层协议来生成2.5层的标签信息;包交换--包为网络层的PDU,故包交换是基于IP地址进行数据转发;就是路由器的路由行为;原始的包交换:数据包进入路由器后,路由器需要查询本地的路由表(RIB-路由信息数据库),再基于下一跳或者目标ip查询本地的A......
  • datawhale深度学习入门:task1学习笔记
    机器学习是一种人工智能的分支,它主要涉及通过经验和数据来训练计算机模型以自动处理任务或进行预测。这些模型可以利用算法和数学模型来分析和学习数据,然后使用这些知识来执行特定的任务,如图像识别、语音识别、自然语言处理、数据分类、趋势预测等。深度学习是人工智能(AI)中的......
  • 资料分析笔记
    一、统计术语基期:作为对比参照的时期现期:相对于基期的称为现期描述具体数值时称之为基期量和现期量增长量vs增长率增长量:现期量和基期量增长(或减少)的绝对值增长量是具体值,有单位增长量=现期量-基期量增长量有正负,负值代表减少量增长率:增长量和基期量的相对......
  • Datawhale X 李宏毅苹果书 AI夏令营 Task1.2 笔记
    《深度学习详解》3.2节中关于批量和动量的主要内容总结: 批量的概念:在深度学习训练过程中,数据不是一次性全部用于计算梯度,而是被分成多个小批量(batch),每个批量包含一定数量的数据。每个批量的损失函数用于计算梯度并更新模型参数。批量大小对梯度下降法的影响:两种极端情况:......