題目描述經典的線性dp模型:設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種:
1、刪除乙個字元;
2、插入乙個字元;
3、將乙個字元改為另乙個字元;
!皆為小寫字母!
集合表示: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...