P2758 編輯距離 線性DP

2021-10-06 02:57:12 字數 1109 閱讀 5540

題目描述

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

1、刪除乙個字元;

2、插入乙個字元;

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

!皆為小寫字母!

經典的線性dp模型:

集合表示:dp[ i ] [ j ] 為 使a串的前 i 個字母和 b串的前 j 個字母相同的操作次數,其屬性為操作次數的最小值。

集合劃分 :分為四類, 刪去第 i 個字母,修改第i個字母,在第 i 個字母後增加乙個字母 ,對第 i 個字母不操作。

dp[ i-1 ][ j ] +1為 刪去 第 i 個字母的操作次數

dp[i-1][j-1] +1為 修改 第 i 個字母的操作次數

dp[ i ][ j-1 ] + 1為在第 i 個字母後 增加 乙個字母的操作次數;

dp[i-1][j-1]為對 第 i 個字母不操作的操作次數

取這四個狀態的最小值即為 dp[ i ][ j ] 的值,由此便可得到狀態轉移方程。

當a[i] != b[j] 時:dp[ i ][ j ] = min(dp[ i-1 ][ j ] +1,dp[i-1][j-1] +1,dp[ i ][ j-1 ] + 1);

當a[i] ==b[j] 時:dp[ i ][ j ] = min(dp[ i-1 ][ j ] +1,dp[i-1][j-1] +1,dp[ i ][ j-1 ] + 1,dp[i-1][j-1]);

邊界處理:dp[i][0] = i (刪去i個字母) ,dp[0][j] = j(增加j個字母);

#include

#include

using

namespace std;

const

int n =

2010

;int dp[n]

[n];

intmain()

} cout<[m]

}

洛谷 P2758 編輯距離 線性dp

題目傳送 題意 思路 四種子問題 增 刪,改,不變 那麼定義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個字元,那...

P2758 編輯距離 DP

傳送門 思路 經典兩個字串匹配的dpdp dp,找到狀態轉移方程即可。這裡提供兩種寫法,dpdp dp,記憶化搜尋。實質一樣。p s ps ps 記憶化搜尋看著舒服一些。d pdp dp include using namespace std typedef long long ll const i...

P2758 編輯距離 dp

設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。只有乙個正整數,為最少字元操作次數。輸入 1複製 sfdq...