线性dp(数字三角形,LIS,LCS,LCIS)

文章目录

  • 线性dp
    • 数字三角形
      • 题目
      • 思路
    • LIS(最长上升子序列)
      • 代码(n^2)
      • 二分优化(nlogn)
    • LCS(最长公共子序列)
      • 代码
    • LCS——>>LIS
      • 思路
      • 代码
    • 最长公共子串
    • 最长公共上升子序列(LCIS)

线性dp

数字三角形

P1216 数字三角形 - 洛谷

题目

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

思路

每个数字只能有上方,左上,数字递推而来。最后计算最底层最大值。

int a[1100][1100],f[1100][1100];
void solve()
{int n;cin>>n;fir(i,1,n)fir(j,1,i){cin>>a[i][j];}fir(i,1,n){fir(j,1,i)f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];}int mx=0;fir(i,1,n)mx=max(f[n][i],mx);cout<<mx<<'\n';
}
  • 那如果向左和向右移动次数相差不能大于1,最大值又是多少了?

    易知,当n为偶数,最后一层落在的点一定在n/2或n/2+1.而n为奇数时,最后一层落在的点一定在n/2+1

LIS(最长上升子序列)

例题

B3637 最长上升子序列 - 洛谷 | 计算机科学教育新生态

数组f【i】,用来存储以a【i】作末尾的上升子序列长度。

代码(n^2)

#include<bits/stdc++.h>
using namespace std;
int a[1000050],f[100050];
int main()
{int n,ans=1;cin>>n;for(int i=1;i<=n;i++)cin>>a[i]; fill(f,f+n+2,1);//初始化for(int i=2;i<=n;i++){for(int j=1;j<i;j++){if(a[j]<a[i])//递增f[i]=max(f[i],f[j]+1);}ans=max(ans,f[i]);}cout<<ans<<'\n';
}

二分优化(nlogn)

维和一个数组b,存放上升子序列。 其中 b[i]表示长度为 i 的上升子序列的最小末尾元素。

从前往后遍历数组a

  • a[i]>b[len]末尾元素,b[++len]=a[i]
  • a[i]<=b[len],用a[i] 替换b数组第一个>=a[i]的元素

最终b数组的长度便是答案

用vector和lower_bound实现

#include<bits/stdc++.h>
using namespace std;
int n,a[1000050];
int main()
{cin>>n;vector<int> d;for(int i=0;i<n;i++){    cin>>a[i];auto it=lower_bound(d.begin(),d.end(),a[i]);if(it==d.end())d.push_back(a[i]);else *it=a[i];}cout<<d.size();
}

LCS(最长公共子序列)

这个视频讲的不错E05 线性DP 最长公共子序列,本文思路节选于此视频

例题

U165581 最长公共子序列(Longest Common Subsequence,LCS) - 洛谷 | 计算机科学教育新生态

f[i][j] 表示序列 a[1...i]b[1...j] 的最长公共子序列长度。

现在判断末尾元素 a[i]b[j] 是否在公共子序列中:

  1. a[i] = b[j]
    • a[i]b[j] 在公共子序列中。
    • 递推关系:f[i][j] = f[i-1][j-1] + 1
  2. a[i] ≠ b[j],且 a[i] 不在公共子序列中
    • 则可去掉 a[i]
    • 递推关系:f[i][j] = f[i-1][j]
  3. a[i] ≠ b[j],且 b[j] 不在公共子序列中
    • 则可去掉 b[j]
    • 递推关系:f[i][j] = f[i][j-1]

状态转移方程

f [ i ] [ j ] = { f [ i − 1 ] [ j − 1 ] + 1 , 若  a [ i ] = b [ j ] max ⁡ ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] ) , 若  a [ i ] ≠ b [ j ] f[i][j] = \begin{cases} f[i-1][j-1] + 1, & \text{若 } a[i] = b[j] \\ \max(f[i-1][j], f[i][j-1]), & \text{若 } a[i] \neq b[j] \end{cases} f[i][j]={f[i1][j1]+1,max(f[i1][j],f[i][j1]), a[i]=b[j] a[i]=b[j]
边界条件

f [ 0 ] [ j ] = 0 ; f [ i ] [ 0 ] = 0 ; f[0][j]=0;f[i][0]=0; f[0][j]=0;f[i][0]=0;

代码

int n,f[N][N];
int main()
{   string a,b;cin>>a>>b;for(int i=0;i<a.size();i++)for(int j=0;j<b.size();j++){if(a[i]==b[j])f[i+1][j+1]=f[i][j]+1;elsef[i+1][j+1]=max(f[i][j+1],f[i+1][j]);}cout<<f[a.size()][b.size()];
}

LCS——>>LIS

例题

P1439 【模板】最长公共子序列 - 洛谷

思路

此题特殊之处在于:全排列

数据范围大,N^2不行

既然两个数组都是1-n的全排列,那么可以用一个新的数组c存放b[i]在数组a中的位置,只有c中递增的子序列才可构成a,b的公共子序列。这样题目就转化为求最长上升子序列了

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N],b[N],c[N];
int main()
{   cin>>n;for(int i=1;i<=n;i++){cin>>a[i];b[a[i]]=i;//哈希}for(int i=1;i<=n;i++){ int x;cin>>x;c[i]=b[x];//LCS——>LIS}vector<int> v;//二分优化的最长上升子序列for(int i=1;i<=n;i++){auto it=lower_bound(v.begin(),v.end(),c[i]);if(it==v.end()) v.push_back(c[i]);else *it=c[i];}cout<<v.size(); 
}

最长公共子串

  • 公共子串:字符必须是连续相等的

  • 公共子序列:字符必须是相等的,可以不连续

    f[i][j] 表示序列 a[1...i]b[1...j] 的最长公共子串长度。

与最长公共子序列类似,递推公式有所不同。
f [ i ] [ j ] = { f [ i − 1 ] [ j − 1 ] + 1 , 若  a [ i ] = b [ j ] 0 , 若  a [ i ] ≠ b [ j ] f[i][j] = \begin{cases} f[i-1][j-1] + 1, & \text{若 } a[i] = b[j] \\\ 0, & \text{若 } a[i] \neq b[j]\end{cases} f[i][j]={f[i1][j1]+1, 0 a[i]=b[j] a[i]=b[j]
最长公共子串不一定是以n,m结尾的,需要比较出最大值。

最长公共上升子序列(LCIS)

这是LIS和LCS的结合。

动态规划状态转移

  1. 初始化:我们初始化一个二维数组 f,大小为 (n+1) x (n+1),并将所有元素初始化为 0。这里 n 是序列 A 和 B 的长度。

  2. 状态转移

    首先判断公共子序列中是否包含a[i]

    • 不包含a [i]的子集,最大值是f[i-1] [j]

    • 包含a[i] 的子集,将这个子集继续划分,依据是子序列的倒数第二个元素在b[]中是哪个数(也就是由谁递推而来)

      所以需要一个mx,来记录在当前 i 的条件下,满足 a[i] > b[k]f[i - 1][k] + 1 的前缀最大值。

  3. 优化:为了提高效率,我们可以在遍历 j 的过程中维护一个最大值 mx,表示在当前 i 的情况下,所有 f [i-1] [k] 的最大值,其中 k < j 且 B[k] < A[i]。这样,我们就可以在 O(1) 的时间更新 f[i][j]。

  • f[i][j] 表示所有 a[1 ~ i]b[1 ~ j] 中以 b[j] 结尾的公共上升子序列的长度最大值。
  • mx 用于记录在当前 i 的条件下,满足 a[i] > b[k]f[i - 1][k] + 1 的前缀最大值。
  • 下面代码是一维优化后的代码
int a[3050],b[3050],f[3050];
void solve()
{int n,mx;cin>>n;fir(i,1,n)cin>>a[i];fir(i,1,n)cin>>b[i];fir(i,1,n)//只看前i个{mx=1;fir(j,1,n){if(a[i]==b[j]) f[j]=max(f[j],mx);if(a[i]>b[j]) mx=max(mx,f[j]+1);}}mx=0;fir(i,1,n)mx=max(f[i],mx);cout<<mx<<'\n';
}  

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

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

相关文章

Spring Validation参数校验

Spring Validation是Spring框架中用于数据校验的核心模块&#xff0c;通过注解简化数据校验逻辑。 1. 依赖引入&#xff08;SpringBoot项目&#xff09; Spring Boot项目&#xff1a;自动包含spring-boot-starter-validation <dependency><groupId>org.springfra…

《AI大模型趣味实战》No2 : 快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色(中)

快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色(中) 摘要 在上一篇文章中&#xff0c;我们介绍了如何搭建一个基础的家庭网站&#xff08;V1.0版本&#xff09;&#xff0c;包含了用户管理、相册管理、时间线和日历等功能。本文将继续深入&#xff0c;详细…

pythonSTL---sys

sys 是 Python 标准库中的一个内置模块&#xff0c;它提供了许多与 Python 解释器和系统环境进行交互的功能。 sys方法 1. 导入 sys 模块 在使用 sys 库的功能之前&#xff0c;需要先导入它&#xff1a; import sys2. 命令行参数 (sys.argv) sys.argv 是一个包含命令行参数…

软件需求分类、需求获取(高软46)

系列文章目录 软件需求分类&#xff0c;需求获取 文章目录 系列文章目录前言一、软件需求二、获取需求三、真题总结 前言 本节讲明软件需求分类、需求获取的相关知识。 一、软件需求 二、获取需求 三、真题 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;

Zabbix7.0+DeepSeek大模型实现人工智能告警分析

一、方案概述 本方案基于Zabbix7.0监控系统,通过底层webhook脚本机制集成Deepseek做故障分析提供解决方案,构建智能化运维体系。 其核心架构包括: Zabbix监控平台:负责实时监控和告警触发 Webhook接口:实现告警信息的传递 Deepseek AI平台:提供故障智能分析能力 二、…

CPU相关:实时cpu信息接口

[rootxxx ~]# cat /proc/cpuinfo #通过实时cpu信息接口查看cpu信息

Certbot实现SSL免费证书自动续签(CentOS 7版 + Docker部署的nginx)

前置安装&#xff0c;可参考Certbot实现SSL免费证书自动续签&#xff08;CentOS 7 nginx/apache&#xff09; 如果是通过 Docker 运行 Nginx&#xff0c; certbot 无法直接检测到本地的 Nginx 配置。解决方案是 使用 standalone 模式 或 挂载 Webroot 方式获取 SSL 证书&…

A SURVEY ON POST-TRAINING OF LARGE LANGUAGE MODELS——大型语言模型的训练后优化综述——第2部分

3、微调&#xff08;上一部分内容&#xff09; 4、LLMs的对齐 大型语言模型&#xff08;LLMs&#xff09;中的对齐涉及引导模型输出以符合人类预期和偏好&#xff0c;特别是在安全关键或用户面对的应用程序中。本章讨论了实现对齐的三个主要范式&#xff1a; 带有反馈的人工…

热key探测技术架构设计与实践

参考&#xff1a; 得物热点探测技术架构设计与实践 Redis数据倾斜与JD开源hotkey源码分析揭秘 京东热点检测 HotKey 学习笔记 hotkey: 京东App后台中间件&#xff0c;毫秒级探测热点数据&#xff0c;毫秒级推送至服务器集群内存&#xff0c;大幅降低热key对数据层查询压力 …

Windows 环境图形化安装 Oracle 23ai

文章目录 Windows 环境安装23ai下载Oracle 23ai安装包安装安装详细图形界面连接Oracle 23ai 安装过程中遇到的错误安装过其他版本数据库&#xff0c;设置了ORACLE_HOME或 TNS_ADMIN解决方法 无法访问Windows Installer Serviece (error 1719)解决方法 其他注意 参考&#xff1a…

RabbitMQ支持的复杂的消息交换模式

RabbitMQ支持多种复杂的消息交换模式&#xff0c;这些模式通过不同的交换机类型和队列特性实现&#xff0c;能够满足多样化的业务需求。以下是RabbitMQ支持的主要复杂消息交换模式&#xff1a; 1. Direct Exchange&#xff08;直连交换机&#xff09; 直连交换机根据消息的路由…

基于SpringBoot3+Druid数据库连接池与外部PostgreSQL的Kubernetes Pod YAML全解析

说明 一个基于Spring Boot 3 Druid 外部PostgreSQL的Kubernetes Pod YAML详细解析&#xff0c;包含最佳实践和关键配置说明&#xff1a; YAML apiVersion: apps/v1 kind: Deployment metadata:name: springboot-applabels:app: springboot-app spec:replicas: 2selector:ma…

Android 全局工具类 AppHolder:高效管理 Application 和 Activity

引言 介绍 AppHolder 的作用&#xff1a;全局管理 Application 和 Activity&#xff0c;简化开发。适用场景&#xff1a;需要全局上下文和生命周期管理的场景。 功能特性 全局上下文管理。Activity 生命周期监听。Fragment 生命周期监听&#xff08;可选&#xff09;。应用状态…

PyTorch 深度学习实战(14):Deep Deterministic Policy Gradient (DDPG) 算法

在上一篇文章中&#xff0c;我们介绍了 Proximal Policy Optimization (PPO) 算法&#xff0c;并使用它解决了 CartPole 问题。本文将深入探讨 Deep Deterministic Policy Gradient (DDPG) 算法&#xff0c;这是一种用于连续动作空间的强化学习算法。我们将使用 PyTorch 实现 D…

【深度学习与大模型基础】第5章-线性相关与生成子空间

线性相关是指一组向量中&#xff0c;至少有一个向量可以表示为其他向量的线性组合。具体来说&#xff0c;对于向量组 v1,v2,…,vn&#xff0c;如果存在不全为零的标量 c1,c2,…,cn使得&#xff1a; c1v1c2v2…cnvn0 则称这些向量线性相关。否则&#xff0c;它们线性无关。 举…

【Agent实战】货物上架位置推荐助手(RAG方式+结构化prompt(CoT)+API工具结合ChatGPT4o能力Agent项目实践)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 结论 效果图示 1.prompt 2. API工具封…

Go语言入门基础详解

一、语言历史背景 Go语言由Google工程师Robert Griesemer、Rob Pike和Ken Thompson于2007年设计&#xff0c;2009年正式开源。设计目标&#xff1a; 兼具Python的开发效率与C的执行性能内置并发支持&#xff08;goroutine/channel&#xff09;简洁的类型系统现代化的包管理跨…

HarmonyOS NEXT开发进阶(十二):build-profile.json5 文件解析

文章目录 一、前言二、Hvigor脚本文件三、任务与任务依赖图四、多模块管理4.1 静态配置模块 五、分模块编译六、配置多目标产物七、配置APP多目标构建产物八、定义 product 中包含的 target九、拓展阅读 一、前言 编译构建工具DevEco Hvigor&#xff08;以下简称Hvigor&#x…

基于SSM + JSP 的图书商城系统

基于SSM的图书商城 网上书城、图书销售系统、图书销售平台 &#xff5c;Java&#xff5c;SSM&#xff5c;HTML&#xff5c;JSP&#xff5c; 项目采用技术&#xff1a; ①&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Tomcat ②&#xff1a;技术栈&#xff1a;Java、…

色板在数据可视化中的创新应用

色板在数据可视化中的创新应用&#xff1a;基于色彩感知理论的优化实践 引言 在数据可视化领域&#xff0c;色彩编码系统的设计已成为决定信息传递效能的核心要素。根据《Nature》期刊2024年发布的视觉认知研究&#xff0c;人类大脑对色彩的识别速度比形状快40%&#xff0c;色…