線性dp典中典題目 編輯距離(洛谷 P2758)

2021-09-29 14:46:33 字數 1198 閱讀 5901

題目描述

設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種:

1、刪除乙個字元;

2、插入乙個字元;

3、將乙個字元改為另乙個字元;

!皆為小寫字母!

輸入格式

第一行為字串a;第二行為字串b;字串a和b的長度均小於2000。

輸出格式

只有乙個正整數,為最少字元操作次數。

線性dp

設狀態dp[i][j]的含義為字串a的前 i 部分,和字串b的前 j 部分相匹配所要的最少操作次數;

那麼dp[i][j]可由三個狀態轉化而來:

1.刪除,那麼串a的前 i-1 部分必須和串b的前 j 部分匹配,那麼只要刪除第 i 個字元就行;

dp[i][j]=min(dp[i][j],dp[i-1][j]+1);

2.插入,和刪除乙個道理,串a的前 i 部分必須和串b的前 j-1 部分匹配,只要在第i個字元後面插入乙個字元就行;

dp[i][j]=min(dp[i][j],dp[i][j-1]+1);

3.改字元,那麼就分兩種情況了,一種是a[i]和b[j]相等,直接等於上乙個狀態;一種是不相等,那麼就要改了;

dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);

**:

#include

#define ll long long

#define pa pair

#define lson k<<1

#define rson k<<1|1

#define inf 0x3f3f3f3f

//ios::sync_with_stdio(false);

using

namespace std;

const

int n=

2100

;const

int m=

200100

;const ll mod=

1e9+7;

int dp[n]

[n];

char a[n]

,b[n]

;int

main()

} cout<[m]

}

線性dp典中典題目 最長上公升子串行(LIS)

首先講講什麼是子串行 1.子串行的元素不一定相鄰 2.子串行一定是原序列的子集 題目鏈結 解法一 線性動態規劃 複雜度 n 2 我們可以維護乙個陣列dp,使得dp i 為以i元素為結尾的最長上公升子串行的長度,那麼對於每乙個dp i 而言,初始值都為1 這種寫法對於上面那道題來說,tle inclu...

線性DP 最短編輯距離

現在給定兩個字串a和b,現在要將a經過若干操作變為b,可進行的操作有 刪除 將字串a中的某個字元刪除。插入 在字串a的某個位置插入某個字元。替換 將字串a中的某個字元替換為另乙個字元。請問將a變為b至少需要進行多少次操作。輸入格式 第一行包含整數n,表示字串a的長度。第二行包含乙個長度為n的字串a。...

經典 簡單線性DP 最短編輯距離

給定長度n,m的字串a,b,有3種操作 略 問字串a變成b最少操作次數 n,m 1000 dp i j 表示的是 s 1.i 變為 t 1 j 所需要的最少操作 故可分為三種情況討論 1.刪除s最,後乙個字元 顯然上一狀態為 s1 i 1 t1 j 2.s後新增乙個字元 同理上一狀態為 s1 i t...