洛谷 P2758 編輯距離 線性dp

2021-10-11 05:48:21 字數 1918 閱讀 3463

題目傳送

題意:

思路:

四種子問題:

增 ,刪,改,不變

那麼定義dp陣列倆個狀態 : 字串a的前i個字元轉化成字串的前j個字元所需要的次數

1.保持當前狀態 dp[i][j] = dp[i][j]

2.dp[i][j] = dp[i-1][j] a的前i個字元轉化成b的前j個字元 等於 把a的前i-1個字元轉化成b的前j個字元,那麼刪乙個即可

3.dp[i][j] = dp[i][j-1] a的前i個字元 轉化成 b的前j-1個字元 ,那麼在此基礎上再添乙個字元即可

4.改變,那麼等於dp[i-1][j-1] + (s1[i] != s2[j]) 如果不同,必須改變

除此之外,還先要預處理dp陣列已經確定的狀態,dp[i][0] = i ,dp[0][j] = i,全刪和全添的狀態

考慮dp的基本步驟:

考慮有哪些子問題

考慮dp陣列所存的狀態(也就是dp陣列是怎麼實現,這裡就是i和j倆種狀態)

考慮遞推方程式

注意無後效性

ac**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

inline

long

long

read()

while

(c >=

'0'&& c <=

'9')

return x*s;

}using

namespace std;

#define newnode (treenode *)malloc(sizeof(treenode))

#define mem(a,b) memset(a,b,sizeof(a))

#define lowbit(x) (x)&(-x)

#define int long long

const

int n =

1e4+

100;

const

long

long infinf =

0x7f7f7f7f7f7f7f

;const

int inf =

0x3f3f3f3f

;const

double eps =

1e-5

;const

int mod =

1e9+7;

const

double ii =

acos(-

1);const

double pp =

(ii*

1.0)/(

180.00);

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

typedef pair piil;

int dp[

2005][

2005];

signed

main()

);}}

cout << dp[len1]

[len2]

<< endl;

}

P2758 編輯距離 線性DP

題目描述 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!經典的線性dp模型 集合表示 dp i j 為 使a串的前 i 個字母和 b串的前 j 個字母相同的操作次數,其...

編輯距離(洛谷 P2758 )

洛谷 p2758 編輯距離 題目描述 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入輸出格式 輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於200...

P2758 編輯距離(洛谷)

傳送門 這道題,dp問題 用dp i j 表示a中的前i個字元與b中的前j個字元轉化的最少次數。那麼當a i b j 時 dp i j dp i 1 j 1 其餘情況,要麼替換要麼刪除要麼新增。替換 dp i j dp i 1 j 1 1 刪除 dp i j dp i 1 j 1 新增 dp i j...