LIS(最長上升子序列)與LCS(最長公共子序列)

最長上升子序列

定義:給出一個數字序列(arr),求出其中長度最長的數值嚴格遞增的子序列

做法一:使用動態規劃,我們定義dp[i]為以arr[i]結尾的最長上升子序列的長度。

#include<bits/stdc++.h>
using namespace std;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin>>n;vector<int> v(n+1,0);for(int i=1; i<=n; i++) cin>>v[i];vector<int> dp(n+1);dp[1] = 1;int res=1;for(int i=2; i<=n; i++){int maxn = 0;for(int j=1; j<i; j++){if(v[j]<v[i]) maxn = max(maxn,dp[j]);}dp[i] = maxn+1;res = max(res,dp[i]);	}cout<<res<<endl;return 0;
}

做法二:我們如果僅僅需要求出最后的結果,可以考慮貪心+二分查找來優化。

我們對于遍歷到的每一個元素,我們都在dp數組中去尋找第一個大于等于它的元素,如果沒有,代表它最大,所以直接加入dp,如果找到,則更新這個位置為當前元素,以此來保證為未來提供更小的末尾序列。

#include<bits/stdc++.h>
using namespace std;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin>>n;vector<int> v(n+1,0);for(int i=1; i<=n; i++) cin>>v[i];vector<int> dp;for(int i=1; i<=n; i++){int now = v[i];auto x = lower_bound(dp.begin(),dp.end(),now);if(x==dp.end()) dp.push_back(now);else *x = now;}cout<<dp.size()<<endl;return 0;
}

最長公共子序列

定義:給出兩個數字序列,求出兩個數字序列的最長子序列的長度。

若兩個序列(記為arr1,arr2)中的數字是可以重復的,即最普遍的情況:

直接采用動態規劃做法,我們定義dp[i][j]為arr1的前i個數和arr2的前j個數的最長子序列的長度。

我們對兩個數組均進行從頭遍歷,若arr1[i]==arr2[i],那么dp[i][j]可以直接由dp[i-1][j-1]加一得出。若不等,則為max(dp[i-1][j],dp[i][j-1])。

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin>>n;vector<int> v1(n+1,0);vector<int> v2(n+1,0);for(int i=1; i<=n; i++) cin>>v1[i];for(int i=1; i<=n; i++) cin>>v2[i];vector<vector<int>> dp(n+1,vector<int>(n+1,0));for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(v1[i]==v2[j]) dp[i][j] = dp[i-1][j-1]+1;else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);}}	cout<<dp[n][n]<<endl;return 0;
}

我們發現,當前狀態只與上一個階段的狀態以及當前狀態的j-1有關,所以我們可以去掉第一個維度

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin>>n;vector<int> v1(n+1,0);vector<int> v2(n+1,0);for(int i=1; i<=n; i++) cin>>v1[i];for(int i=1; i<=n; i++) cin>>v2[i];vector<int> dp(n+1,0);for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(v1[i]==v2[j]) dp[j] = dp[j-1]+1;else dp[j] = max(dp[j],dp[j-1]);}}cout<<dp[n]<<endl;return 0;
}

這樣做的時間復雜度是O(n2)的

若兩個序列(記為arr1,arr2)是排列,即元素不重復【洛谷:P1439 【模板】最長公共子序列】:

我們可以將問題轉換為LIS來做。

我們將arr1中的元素值和位置做一個映射,然后將arr2中的元素全部轉換為位置。

理由:因為公共子序列要求兩個序列中順序相同,而如果arr1和arr2具有公共子序列,那么他們的索引一定都是遞增的,所以最長遞增子序列此時就是最長公共子序列。

#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin>>n;vector<int> v1(n+1,0);vector<int> v2(n+1,0);vector<int> pos(n+1,0);vector<int> arr(n+1,0);for(int i=1; i<=n; i++){cin>>v1[i];pos[v1[i]]=i;}for(int i=1; i<=n; i++){cin>>v2[i];arr[i] = pos[v2[i]];	}vector<int> dp;for(int i=1; i<=n; i++){int now = arr[i];auto x = lower_bound(dp.begin(),dp.end(),now);if(x==dp.end()) dp.push_back(now);else *x = now;}cout<<dp.size()<<endl;return 0;
}

這樣的復雜度是O(nlogn)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92563.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92563.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92563.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javaSE(基礎):5.抽象類和接口

抽象類一.理解抽象類思維&#xff1a;假如我想定義一個Shape&#xff08;圖形類&#xff09;類&#xff0c;我在這個類中寫了一個draw()方法&#xff0c;但是這個方法是不能用來描述圖形形狀的&#xff08;不能有方法體&#xff09;&#xff0c;因為我只要對他進行了準確描述&a…

ESG評級可持續發展之路,ESG評級的好處

在商業文明的演進歷程中&#xff0c;ESG評級正成為衡量企業價值的全新坐標系。這套融合環境&#xff08;Environmental&#xff09;、社會&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;三大維度的評估體系&#xff0c;猶如一盞明燈&#xff0c;指引…

camera人臉識別問題之二:【FFD】太陽逆光場景,人像模式后置打開美顏和濾鏡,關閉heif拍攝格式對著人臉拍照,成像口紅出現位置錯誤

【關注我&#xff0c;后續持續新增專題博文&#xff0c;謝謝&#xff01;&#xff01;&#xff01;】 上一篇我們講了&#xff1a; 這一篇我們開始講&#xff1a; camera人臉識別問題之二&#xff1a;【FFD】太陽逆光場景&#xff0c;人像模式后置打開美顏和濾鏡&#xff0c;關…

YOLO-Count:用于文本到圖像生成的可微分目標計數

摘要 https://arxiv.org/pdf/2508.00728v1 我們提出了YOLO-Count&#xff0c;一種可微分的開放詞匯目標計數模型&#xff0c;旨在解決通用計數挑戰并實現文本到圖像(T2I)生成的精確數量控制。核心貢獻是"基數"圖(cardinality map)&#xff0c;這是一種新穎的回歸目標…

Go 的錯誤處理方式深度解析—— error vs panic vs recover:機制原理與實戰取舍

一、Go 的錯誤處理哲學Go 的設計哲學鼓勵明確的、顯式的錯誤處理方式。它不像 Java 或 Python 使用異常機制&#xff0c;而是采用了返回值 error 的方式&#xff0c;讓錯誤成為程序流程的一部分。Go 的錯誤處理核心理念是&#xff1a; 錯誤是值&#xff08;Errors are values&a…

官方Windows系統部署下載工具實踐指南

摘要&#xff1a;本文介紹兩款用于獲取微軟正版系統部署文件的工具&#xff0c;適用于需要快速搭建Windows環境的技術人員。所有工具均基于官方渠道實現&#xff0c;不涉及系統修改或激活功能。一、Windows系統鏡像下載方案工具名稱&#xff1a;Windows鏡像直鏈下載工具 核心功…

Pandas query() 方法詳解

Pandas query() 方法詳解query() 是 Pandas 中一個非常強大的方法&#xff0c;它允許你使用字符串表達式來篩選數據行。這種方法比傳統的布爾索引更簡潔、更易讀。基本語法df.query(expr, inplaceFalse, **kwargs)expr: 查詢字符串表達式inplace: 是否原地修改 DataFrame (默認…

Linux系統層IO

1.c語言文件操作 fopen&#xff1a;打開文件&#xff0c;模式 "w"&#xff08;寫&#xff0c;覆蓋&#xff09;或 "r"&#xff08;讀&#xff09;。 fwrite&#xff1a;fwrite(data, size, count, fp)&#xff0c;按 size 字節寫入 count 次數據。 fread…

QT中的trimmed() 方法(1)

QT中的trimmed() 方法&#xff08;2&#xff09; trimmed() 是 Qt 框架 中 QString 類提供的一個方法&#xff0c;用于 去除字符串首尾的空白字符&#xff08;whitespace characters&#xff09;。它的作用類似于標準 C 中的 std::string 的 trim 操作&#xff0c;但專為 Qt 的…

動漫軟件集合分享

通過網盤分享的文件&#xff1a;動漫軟件 鏈接: https://pan.baidu.com/s/1TD_OmaAZksfFxJ4PW6rS-w?pwd1234 提取碼: 1234 打印動漫.apk 當鳥動漫.apk 動漫共和國【OmoFun復活】.apk 咕咕香.apk 黑貓動漫.apk 團次元【推薦】.apk 橘漫.apk 曼波.apk 萌國.apk 趣動漫.apk 三…

Mysql與Ooracle 索引失效場景對比

MySQL 和 Oracle 作為主流關系型數據庫&#xff0c;其索引失效的場景既有共性&#xff0c;也因底層優化器、索引類型支持等差異存在不同。以下從常見索引失效場景對比兩者的表現及原因&#xff1a;一、索引列上使用函數 / 表達式共性&#xff1a;若直接在索引列上使用函數或表達…

【unity知識】unity使用AABB(軸對齊包圍盒)和OBB(定向包圍盒)優化碰撞檢測

文章目錄前言一、AABB&#xff08;軸對齊包圍盒&#xff09;1、基本概念2、數學表示3、Unity中的實現4、實際應用示例二、OBB&#xff08;有向包圍盒&#xff09;1、Physics.ComputePenetration (Unity 物理引擎)1.1 基本概念1.2 Unity中的實現1.3 實際應用示例2、OBB (SAT) 手…

Numpy科學計算與數據分析專題

Numpy科學計算與數據分析 1. Numpy入門&#xff1a;數組操作與科學計算基礎 2. Numpy入門&#xff1a;多平臺安裝與基礎環境配置 3. Numpy數組創建與應用入門 4. Numpy數組屬性入門&#xff1a;形狀、維度與大小 5. Numpy數組索引與切片入門 6. Numpy數組操作入門&#xff1a;…

齊護機器人小智AI_MCP圖形化編程控制Arduino_ESP32

齊護機器人小智AI_MCP圖形化編程控制Arduino_ESP32 齊護AiTall在項目實踐里&#xff0c;我們常常期望達成這樣一種場景&#xff1a;借助智能體&#xff08;例如小智 AI&#xff09;來遠程操控其他開發板上的設備&#xff0c;這類似于智能家居系統中智能音箱與各類家電的互動模式…

CPO-SVM分類預測+特征貢獻SHAP分析,通過特征貢獻分析增強模型透明度,Matlab代碼實現,引入SHAP方法打破黑箱限制,提供全局及局部雙重解釋視角

代碼功能 該Matlab代碼實現了一個基于CPO-SVM冠豪豬算法優化支持向量機的數據分類模型&#xff0c;結合了SHAP可解釋性分析&#xff0c;CPO選擇最佳的SVM參數c和g。 SVM模型有兩個非常重要的參數C與gamma。其中 C是懲罰系數&#xff0c;即對誤差的寬容度。c越高&#xff0c;說明…

Failed to restart docker.service: Unit docker.service is masked.

docker.service 被標記為 "masked" 意味著 systemd 已阻止該服務被啟動或運行。這通常發生在 Docker Desktop 安裝過程中,因為它使用自己的服務管理機制。以下是解決方法: 解決方案: 解除服務的 mask 狀態: bash sudo systemctl unmask docker.service sudo sys…

2025 藍橋杯C/C++國B 部分題解

P12836 [藍橋杯 2025 國 B] 翻倍 題目描述 給定 nnn 個正整數 A1,A2,…,AnA_1, A_2, \ldots, A_nA1?,A2?,…,An?&#xff0c;每次操作可以選擇任意一個數翻倍。 請輸出讓序列單調不下降&#xff0c;也就是每個數都不小于上一個數&#xff0c;最少需要操作多少次&#xff1f;…

os標準庫

os標準庫os包提供了操作系統函數&#xff0c;但和操作系統無關。 os包的接口規定為在所有操作系統中都是一致的。 設計為Unix風格的。1. 權限說明 os標準庫有大量的文件操作&#xff0c;在創建文件等操作中&#xff0c;需要指的perm。 在go語言中perm是一個uint32類型 在go語言…

QtC++ 中使用 qtwebsocket 開源庫實現基于websocket的本地服務開發詳解

前言 當前實時通信功能越來越受到重視&#xff0c;無論是在線聊天、實時數據監控還是多人協作工具&#xff0c;都離不開高效、穩定的實時通信技術。WebSocket 作為一種全雙工通信協議&#xff0c;為實時通信提供了良好的解決方案。而在 QtC 開發環境中&#xff0c;qtwebsocket …

小程序實時保存優化

背景。避免數據存儲后丟失。要求實時保存。問題&#xff1a;保存時出現卡斷&#xff0c;輸入的內容會被抹除。問題原因。輸入頻繁速度塊&#xff0c;會影響cpu處理速度。解決方案。用戶停止輸入500ms后開始保存&#xff0c;否則不保存。這里是保存方法&#xff1a;當500ms以內有…