[動態規劃]最長公共子序列

題目六 最長公共子序列

題目描述

我們稱一個字符的數組S為一個序列。對于另外一個字符數組Z,如果滿足以下條件,則稱Z是S的一個子序列:(1)Z中的每個元素都是S中的元素(2)Z中元素的順序與在S中的順序一致。例如:當S = (E,R,C,D,F,A,K)時,(E,C,F)和(E,R)等等都是它的子序列。而(R,E)則不是。
現在我們給定兩個序列,求它們最長的公共子序列的長度。

關于輸入

一共兩行,分別輸入兩個序列

關于輸出

一行,輸出最長公共子序列的長度。

例子輸入
ABCBDAB
BDCABA
例子輸出
4
解題分析

這個問題的具體描述是:給定兩個序列,求它們的最長公共子序列的長度。

程序的主要思路如下:

  1. 首先,程序讀取兩個字符串,存儲在word1word2中,然后計算它們的長度len1len2

  2. 然后,程序初始化一個二維數組dpdp[i][j]表示word1的前i個字符和word2的前j個字符的最長公共子序列的長度。

  3. 程序遍歷所有可能的ij(從0到len1len2)。

    • 如果ij為0,那么dp[i][j]就等于0,因為空字符串與任何字符串的最長公共子序列的長度都是0。

    • 如果word1[i-1]等于word2[j-1],那么dp[i][j]就等于dp[i-1][j-1] + 1。這是因為,當前的字符可以加入最長公共子序列。

    • 如果word1[i-1]不等于word2[j-1],那么dp[i][j]就等于dp[i][j-1]dp[i-1][j]中的較大值。這是因為,當前的字符不能同時加入最長公共子序列,所以我們只能選擇一個。

  4. 最后,dp[len1][len2]就是word1word2的最長公共子序列的長度。

這個程序的時間復雜度是O(n^2),因為它需要遍歷所有可能的ij。如果字符串的長度非常大,那么這個程序可能會運行得比較慢。

代碼實現
#include <iostream>
#include <cstring>
using namespace std;int dp[10005][10005];
char word1[10005],word2[10005];int main() {cin>>word1>>word2;int len1=strlen(word1),len2=strlen(word2);for(int i=0;i<=len1;i++)for(int j=0;j<=len2;j++){if(i==0 || j==0){dp[i][j]=0;}else{if(word1[i-1]==word2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}}cout<<dp[len1][len2]<<endl;return 0;
}
使用記憶搜索法解決問題
#include <iostream>
#include <cstring>
using namespace std;int dp[10005][10005];
char word1[10005],word2[10005];int f(int i,int j){if(i==0 || j==0){return 0;}if(dp[i][j]){return dp[i][j];}if(word1[i-1]==word2[j-1]){dp[i][j]=f(i-1,j-1)+1;}else{dp[i][j]=max(f(i-1,j),f(i,j-1));}return dp[i][j];
}int main() {cin>>word1>>word2;int len1=strlen(word1),len2=strlen(word2);cout<<f(len1,len2)<<endl;return 0;
}

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

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

相關文章

22 FlexSPI—讀寫外部 SPI NorFlash

文章目錄 22.1 SPI 協議簡介22.1.1 SPI物理層22.1.2 協議22.1.3 CPOL/CPHA 及通訊模式22.1.4 擴展 SPI 協議22.1.5 SDR 和 DDR 模式 22.2 RT1052 的 FlexSPI 特性及架構22.2.1 RT1052 的 FlexSPI 外設簡介22.2.2 RT1052 的 FlexSPI 架構剖析22.2.2.1 通訊引腳22.2.2.2 指令查找…

如何將html網頁免費轉為excel?

一、直接復制。 直接復制是最簡單有效、快捷的解決方案&#xff0c;操作方法如下&#xff1a; 1、用鼠標像平常復制文本一樣&#xff0c;將整個網頁表格選中。 2、點擊右鍵&#xff0c;點擊“復制”。 3、打開excel軟件&#xff0c;鼠標點擊任意單元格。 4、點擊右鍵&#…

Power BI - 5分鐘學習拆分列

每天5分鐘&#xff0c;今天介紹Power BI拆分列功能。 什么是拆分列&#xff1f; 有時導入Power BI的數據表中&#xff0c;某列內容都包含同樣的特殊字符如 /&/-/_等&#xff0c;可以利用這個特殊字符進行拆分列的操作&#xff0c;獲得我們想要的信息。 操作舉例&#xf…

【從編譯器的角度看多態的底層實現原理】

系列文章目錄 歡迎讀者訂閱《計算機底層原理》、《從JVM看Java》系列文章、能夠幫助到大家就是對我最大的鼓勵&#xff01; 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、編譯器做了什么&#xff1f; 1.詞法分析 2.語法分析 3.語義分析 4.中間代碼生成 5.優化 6.目標代碼生成…

SugarCRM 任意文件上傳漏洞復現(CVE-2023-22952)

0x01 產品簡介 SugarCRM是美國SugarCRM公司的一套開源的客戶關系管理系統(CRM)。該系統支持對不同的客戶需求進行差異化營銷、管理和分配銷售線索,實現銷售代表的信息共享和追蹤。 0x02 漏洞概述 SugarCRM index.php接口存在安全漏洞,該漏洞源于安裝組件中存在授權繞過和P…

在線人數(oj題)

題目不少于5個字&#xff0c;所以整了個括號湊字數 首先我想到的是用一個數組來記錄每一秒的在線人數 但是即使是short類型&#xff08;2字節&#xff09;&#xff0c;也會用到60 * 60 * 24 * 30 * 12 * 60 * 2 / 1024 / 1024 3,559.5703125 MB 而題目上限是256MB&#xff0…

UE小:UE5性能分析

開始錄制性能追蹤 要開始錄制性能追蹤&#xff0c;您可以簡單地點擊界面上的“開始錄制”按鈕。 查看追蹤數據 錄制完成后&#xff0c;點擊“Trace”菜單中的“UnrealInsights”選項來查看追蹤數據。 使用命令行進行追蹤 如果點擊錄制按鈕沒有反應&#xff0c;您可以通過命令…

【頭歌系統數據庫實驗】實驗4 MySQL單表查詢

目錄 第1關. 在users表中新增一個用戶&#xff0c;user_id為2019100904學號&#xff0c;name為2019-物聯網-李明 第2關. 在users表中更新用戶 user_id為robot_2 的信息&#xff0c;name設為 機器人二號 第3關. 將solution表中所有 problem_id 為1003 題目的解答結果&#xf…

python源碼,在線讀取傳奇列表,并解析為需要的JSON格式

python源碼&#xff0c;在線讀取傳奇列表&#xff0c;并解析為需要的JSON格式 [Server] ; 使用“/”字符分開顏色&#xff0c;也可以不使用顏色&#xff0c;支持以前的舊格式&#xff0c;只有標題和服務器標題支持顏色 ; 標題/顏色代碼(0-255)|服務器標題/顏色代碼(0-255)|服務…

使用醫學數據集MIMIC,常見的問題記錄

目錄 MIMIC數據庫安裝及數據導入教程1.postgresql安裝第一步&#xff1a;error running考慮到是不是不同的sql的沖突從報錯信息出發重啟之后可以安裝了 2.打開navicate153.7z 不是內部或外部命令&#xff0c;也不是可運行的程序4.在postgreSQL中輸入**\i xxx**命令后遇到提示pe…

2023年9月26日 Go生態洞察:深入解析類型參數

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

2023第十二屆“認證杯”D題:CMOS黃昏系數|數學中國數學建模國際賽(小美賽)| 建模秘籍文章代碼思路大全

鐺鐺&#xff01;小秘籍來咯&#xff01; 小秘籍希望大家都能輕松建模呀&#xff0c;數維杯也會持續給大家放送思路滴~ 抓緊小秘籍&#xff0c;我們出發吧~ 來看看認證杯&#xff08;D題&#xff09;&#xff01; 完整內容可以在文章末尾領取&#xff01; 問題重述&#x…

【小紅書運營指南1】賽道選擇 + 賬號運營全周期

小紅書運營指南1 寫在最前面11.23標簽一級標簽二級標簽 網絡資源整理1. 賽道選擇近2年小紅書女性人群畫像 2. 基礎認知階段3. 賬號啟動階段4. 選題規劃階段5. 爆款打造階段6. 漲粉變現階段漲粉變現階段粉絲發展階段 寫在最前面 最近做的一個項目調研&#xff0c;調研和實際有一…

每日移到算法題 1

借鑒文章&#xff1a;Java-敏感字段加密 - 嗶哩嗶哩 題目描述 給定一個由多個命令字組成的命令字符串&#xff1b; 1、字符串長度小于等于127字節&#xff0c;只包含大小寫字母&#xff0c;數字&#xff0c;下劃線和偶數個雙引號 2、命令字之間以一個或多個下劃線_進行分割…

設計模式-工廠模式(Factory)

Factory模式是一種創建型設計模式&#xff0c;用于封裝對象的實例化過程。它提供了一個統一的接口來創建不同類型的對象&#xff0c;而無需暴露具體的實例化邏輯給客戶端。 #include <iostream> #include <memory>// AbstractProduct&#xff08;抽象產品類&#…

mybatis-plus處理blob字段

轉載自&#xff1a;www.javaman.cn 在 Spring Boot 項目中使用 MyBatis-Plus 處理 longblob 字段時&#xff0c;我們可以按照以下步驟進行操作。假設 longblob 存儲的是字符串數據。以下是完整的示例代碼&#xff1a; 添加依賴&#xff1a;在你的項目的 pom.xml 文件中添加 My…

js判斷上傳的文件是GBK編碼還是UTF-8

1、獲取文件二進制數據&#xff0c;這里只做示例&#xff0c;例如element-ui中文件上傳的beforeUpload方法&#xff0c;返回的file對象&#xff0c;然后使用FileReader對其進行轉換&#xff0c;再進行后續判斷 function beforeUpload(file: File) { const reader new FileRea…

Linux基本指令(超詳版)

Linux基本指令&#xff08;超詳版&#xff09; 1. ls指令2.pwd指令3. cd 指令4.touch指令5mkdir指令6.rmdir指令&&rm指令7.man指令7.cp指令8.mv指令9.echo指令10.cat指令11.more指令12.less指令13.head指令14.tail指令15.date指令16.find指令17.grep指令zip(打包壓縮) …

JVM類加載器ClassLoader的源碼分析

1、ClassLoader與現有類加載器的關系 ClassLoader與現有類加載器的關系&#xff1a; ClassLoader是一個抽象類。如果我們給定了一個類的二進制名稱&#xff0c;類加載器應嘗試去定位或生成構成定義類的數據。一種典型的策略是將給定的二進制名稱轉換為文件名&#xff0c;然后去…

C語言--實現一個函數把一個整數轉為它對應的十六進制的字符串

一.題目描述 實現一個函數把一個整數轉為它對應的十六進制的字符串。 比如&#xff1a;輸入數字1234 輸出&#xff1a;4D2 二.思路分析 用一個sprintf函數可以解決問題&#xff0c;輸出相對應的字符串 要注意的問題就是&#xff1a;函數結束后要繼續使用的內存&#xff08;比如…