線性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[i?1][j?1]+1,max(f[i?1][j],f[i][j?1]),??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[i?1][j?1]+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.pswp.cn/web/72408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72408.shtml
英文地址,請注明出處:http://en.pswp.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;色…