国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

最長公共子序列和最長公共子串

這篇具有很好參考價值的文章主要介紹了最長公共子序列和最長公共子串。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

最長公共子序列

題目描述

給出1,2,…,n 的兩個排列P1 和 P2 ,求它們的最長公共子序列。

輸入格式

第一行是一個數(shù) n。

接下來兩行,每行為 n 個數(shù),為自然數(shù)1,2,…,n 的一個排列。

輸出格式

一個數(shù),即最長公共子序列的長度。

題目分析

第一階段定義dp數(shù)組

(1)考慮規(guī)模。兩個序列的長度就是規(guī)模,因為是兩個,所以需要兩個維度來表示。

(2)考慮限制。這里的限制就是對應位置相等,可以在遞推的時候進行限制。

(3)寫dp數(shù)組。 d p [ i ] [ j ] dp[i][j] dp[i][j]表示的第一個序列前i個值和第二個序列前j個值對應的最長公共子序列

第二階段推導狀態(tài)轉(zhuǎn)移方程

(1)如果 s 1 [ i ] = = s 2 [ j ] , d p [ i ] [ j ] = d p [ i ? 1 ] [ j ? 1 ] + 1 s1[i]==s2[j],dp[i][j]=dp[i-1][j-1]+1 s1[i]==s2[j]dp[i][j]=dp[i?1][j?1]+1

(1)如果 s 1 [ i ] ! = s 2 [ j ] s1[i]!=s2[j] s1[i]!=s2[j],那么我們就要從前一個狀態(tài)的最大值里面轉(zhuǎn)移過來,前一個狀態(tài)有哪些呢? d p [ i ? 1 ] [ j ] , d p [ i ] [ j ? 1 ] dp[i-1][j],dp[i][j-1] dp[i?1][j],dp[i][j?1]就是它的前一個狀態(tài), d p [ i ? 1 ] [ j ? 1 ] dp[i-1][j-1] dp[i?1][j?1]不是,因為他距離 d p [ i ? 1 ] [ j ? 1 ] dp[i-1][j-1] dp[i?1][j?1]已經(jīng)變化了2步。 d p [ i ] [ j ] = m a x ( d p [ i ? 1 ] [ j ] , d p [ i ] [ j ? 1 ] ) dp[i][j]=max(dp[i-1][j],dp[i][j-1]) dp[i][j]=max(dp[i?1][j],dp[i][j?1])

第三階段寫代碼

(1)初始化。一開始長度是0。

(2)第一層for循環(huán)遍歷規(guī)模,這里規(guī)模是兩個維度表示的,所以也需要兩層for循環(huán)。

(3)第二層for循環(huán)仍然遍歷規(guī)模。

題目代碼
import java.io.IOException;
import java.util.Scanner;

public class Main{
public static void main(String[] args) throws NumberFormatException, IOException {
	Scanner scanner = new Scanner(System.in);
	int n = scanner.nextInt();
	int m=n;
	int a[] = new int[n+1];
	int b[] = new int[m+1];
	int dp[][] = new int[n+1][m+1];
	for(int i = 1;i <= n;i++) 
		a[i] = scanner.nextInt();
	for(int i = 1;i <= m;i++) 
		b[i] = scanner.nextInt();
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= m;j++) {
			if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
			else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
		}
	}
	System.out.println(dp[n][m]);
}
}

在洛谷提交還是內(nèi)存超限,離譜。

最長公共子串

題目分析

注意子串和子序列的差別,abcde中acd是一個子序列,但不是一個子串,abc是一個子串也是一個子序列。子串的要求要比子序列高。子串必須是連續(xù)的。那么這一點體現(xiàn)在哪里呢。體現(xiàn)在狀態(tài)轉(zhuǎn)移方程以及答案上。

第一階段定義dp數(shù)組

(1)考慮規(guī)模。兩個序列的長度就是規(guī)模,因為是兩個,所以需要兩個維度來表示。

(2)考慮限制。這里的限制就是對應位置相等,可以在遞推的時候進行限制。

(3)寫dp數(shù)組。 d p [ i ] [ j ] dp[i][j] dp[i][j]表示的第一個序列前i個值和第二個序列前j個值對應的最長公共子串

第二階段推導狀態(tài)轉(zhuǎn)移方程

(1)如果 s 1 [ i ] = = s 2 [ j ] , d p [ i ] [ j ] = d p [ i ? 1 ] [ j ? 1 ] + 1 s1[i]==s2[j],dp[i][j]=dp[i-1][j-1]+1 s1[i]==s2[j],dp[i][j]=dp[i?1][j?1]+1

(1)如果 s 1 [ i ] ! = s 2 [ j ] , d p [ i ] [ j ] = 0 s1[i]!=s2[j],dp[i][j]=0 s1[i]!=s2[j],dp[i][j]=0

第三階段寫代碼

(1)初始化。一開始長度是0。

(2)第一層for循環(huán)遍歷規(guī)模,這里規(guī)模是兩個維度表示的,所以也需要兩層for循環(huán)。

(3)第二層for循環(huán)仍然遍歷規(guī)模。

(4)答案。這里的 d p [ i ] [ j ] dp[i][j] dp[i][j]不一定是最終答案,答案要在過程中記錄一個最大值。也就是所有dp值的最大值。 m a x ( d p [ i ] [ j ] ) max(dp[i][j]) max(dp[i][j])。文章來源地址http://www.zghlxwxcb.cn/news/detail-825112.html

題目代碼
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws NumberFormatException, IOException {
	Scanner scanner = new Scanner(System.in);
	char a[];
	char b[];
	a = (" "+scanner.next()).toCharArray();
	b = (" "+scanner.next()).toCharArray();
	int n = a.length-1;
	int m = b.length-1;
	int dp[][] = new int[n+1][m+1];	
	int ans = 0;
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= m;j++) {
			if(('0'<=a[i]&&a[i]<='9') || ('0'<=b[j]&&b[j]<='9')) continue;
			if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
			else dp[i][j] = 0;
			ans = Math.max(ans, dp[i][j]);
		}
	}
	System.out.println(ans);
}
}

到了這里,關于最長公共子序列和最長公共子串的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【算法(四·三):動態(tài)規(guī)劃思想——最長公共子序列問題】

    【算法(四·三):動態(tài)規(guī)劃思想——最長公共子序列問題】

    最長公共子序列(Longest Common Subsequence,簡稱LCS)問題是一種常見的字符串處理問題。它的**目標是找到兩個或多個字符串中的最長公共子序列,這個子序列不需要是連續(xù)的,但字符在原始字符串中的相對順序必須保持一致。**例如,考慮兩個字符串\\\"ABCD\\\"和\\\"ACDF\\\",它們的最長公

    2024年04月13日
    瀏覽(19)
  • 【算法】力扣【動態(tài)規(guī)劃,LCS】1143. 最長公共子序列

    1143. 最長公共子序列 本文是對 LCS 這一 動態(tài)規(guī)劃 模型的整理,以力扣平臺上的算法題1143:最長公共子序列為模板題進行解析。 該題目要求計算兩個字符串的最長公共子序列(Longest Common Subsequence,簡稱LCS)的長度。字符串的子序列是指在不改變字符順序的情況下,通過刪去

    2024年01月17日
    瀏覽(27)
  • 最長公共子串(動態(tài)規(guī)劃)

    查找兩個字符串a(chǎn),b中的最長公共子串_??皖}霸_牛客網(wǎng) 1.找a 和 b 的最長公共子串實際上是在a的子串和b的子串中找最長公共子串 ins[i][j]實際上記錄的就是 以a的第i個字符和以b的第j個字符結(jié)尾的子串中存在的最長公共子串的長度 接下來我們舉個例子: a: abcabcde b: abcd ins[1][1]

    2023年04月12日
    瀏覽(22)
  • python數(shù)據(jù)結(jié)構(gòu)與算法-動態(tài)規(guī)劃(最長公共子序列)

    python數(shù)據(jù)結(jié)構(gòu)與算法-動態(tài)規(guī)劃(最長公共子序列)

    一個序列的子序列是在該序列中刪去若干元素后得 到的序列。 例如:\\\"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最長公共子序列(LCS) 問題: 給定兩個序列X和Y,求X和Y長度最大的公共子字列。 例:X=\\\"ABBCBDE”Y=\\\"DBBCDB”LCS(XY)=\\\"BBCD\\\" 應用場景:字符串相似度比對 (1)問題思考 思考: 暴

    2024年02月08日
    瀏覽(28)
  • 算法分析:C語言實現(xiàn)動態(tài)規(guī)劃之最長公共子序列

    算法分析:C語言實現(xiàn)動態(tài)規(guī)劃之最長公共子序列

    最長公共子序列問題: ??????? ?下面的簡單問題說明了動態(tài)規(guī)劃的基本原理。在字母表一∑上,分別給出兩個長度為n和m的字符串A和B,確定在A和B中最長公共子序列的長度。這里,A = a?a?...an。的子序列是一個形式為a?ka?k...aik的字符串,其中每個i都在1和n之間,并且

    2023年04月21日
    瀏覽(27)
  • 算法套路十五——動態(tài)規(guī)劃求解最長公共子序列LCS

    算法套路十五——動態(tài)規(guī)劃求解最長公共子序列LCS

    給定兩個字符串 text1 和 text2,返回這兩個字符串的最長 公共子序列 的長度。如果不存在 公共子序列 ,返回 0 。 一個字符串的 子序列 是指這樣一個新的字符串:它是由原字符串在不改變字符的相對順序的情況下刪除某些字符(也可以不刪除任何字符)后組成的新字符串。

    2024年02月04日
    瀏覽(23)
  • 算法分析 | 動態(tài)規(guī)劃算法設計之最長公共子序列 C語言版

    算法分析 | 動態(tài)規(guī)劃算法設計之最長公共子序列 C語言版

    聲明:凡代碼問題,歡迎在評論區(qū)溝通。承蒙指正,一起成長! 目錄 一、實驗內(nèi)容與要求 ?二、概要設計 三、直接上代碼???? ?四、輸入數(shù)據(jù)及運行結(jié)果 ? 內(nèi)容:最長公共子序列 ·若給定序列X={x1,x2,…,xm},則另一序列Z={z1,z2,…,zk},是X的子序列是指存在一個嚴格遞增下標序

    2024年02月02日
    瀏覽(27)
  • 9.動態(tài)規(guī)劃——4.最長公共子序列(動態(tài)規(guī)劃類的算法題該如何解決?)

    9.動態(tài)規(guī)劃——4.最長公共子序列(動態(tài)規(guī)劃類的算法題該如何解決?)

    設最長公共子序列 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] 是 S 1 S_1 S 1 ? 的前 i i i 個元素,是 S 2 S_2 S 2 ? 的前 j j j 個元素,那么有: 若 S 1 [ i ? 1 ] = = S 2 [ i ? 1 ] S_1[i-1]==S_2[i-1] S 1 ? [ i ? 1 ] == S 2 ? [ i ? 1 ] ,那么 d p [ i ] [ j ] = d p [ i ? 1 ] [ j ? 1 ] + 1 dp[i][j]=dp[i-1][j-1]+1 d p [

    2024年04月11日
    瀏覽(23)
  • 【算法訓練-字符串 三】最長公共子串、最長公共子序列

    【算法訓練-字符串 三】最長公共子串、最長公共子序列

    廢話不多說,喊一句號子鼓勵自己:程序員永不失業(yè),程序員走向架構(gòu)!本篇Blog的主題是【】,使用【】這個基本的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn),這個高頻題的站點是: CodeTop ,篩選條件為: 目標公司+最近一年+出現(xiàn)頻率排序 ,由高到低的去 ??蚑OP101 去找,只有兩個地方都出現(xiàn)過才做

    2024年02月09日
    瀏覽(22)
  • 算法打卡day49|動態(tài)規(guī)劃篇17| Leetcode 647. 回文子串、516.最長回文子序列

    算法打卡day49|動態(tài)規(guī)劃篇17| Leetcode 647. 回文子串、516.最長回文子序列

    Leetcode 647. 回文子串 題目鏈接:647. 回文子串 大佬視頻講解:647. 回文子串視頻講解 ?個人思路? 這道題的dp數(shù)組有點難找到關聯(lián),以至于遞歸關系也不好找,所以看題解吧... 解法 動態(tài)規(guī)劃 動規(guī)五部曲: 1.確定dp數(shù)組(dp table)以及下標的含義 一般在定義dp數(shù)組的時候 會根據(jù)題

    2024年04月22日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包