題目描述
設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...