洛谷 p2758 編輯距離
題目描述
設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種:
1、刪除乙個字元;
2、插入乙個字元;
3、將乙個字元改為另乙個字元;
!皆為小寫字母!
輸入輸出格式
輸入格式:
第一行為字串a;第二行為字串b;字串a和b的長度均小於2000。
輸出格式:
只有乙個正整數,為最少字元操作次數。
明顯的動歸題嘛因為明顯不好暴力和搜尋
設f[i][j]
表示把a[1~i]
變成b[1~j]
最少的運算元
假設之前的都已經算好了
考慮一下怎麼進行轉移 根據接下來的操作分類
一頓ctrl c + v
之後
狀態轉移方程橫空出世!!!
if(a[i-1]==b[j-1])
f[i][j]=f[i-1][j-1];
else
[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;
這就出現了乙個問題:
f[i-1][j-1]
一定比f[i-1][j-1]+1
和f[i-1][j]+1
小嗎
答案是肯定的
因為需要編輯的字串越長,操作次數只增不減
因此f[i-1][j-1]
至少是小於等於f[i-1][j-1]+1
和f[i-1][j]+1
的
好的上**
#include #include using namespace std;
#define n 2005
int f[n][n];
int main()
//cout<}
cout
}
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...
洛谷 P2758 編輯距離
p2758 編輯距離 一道典型的線性 dp題。像這種線性動態規劃,一種常見的狀態定義方法是 用 f i 表示前 i 個元素滿足要求 只考慮前 i 個元素 時的最佳答案。因此我們很自然地想到用 f i,j 表示將 a 1.i 轉換為 b 1.j 所需的最少操作次數,f n,m 就是問題的答案 n,m ...
P2758 編輯距離
p2758 編輯距離 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於2000。輸出格式 只有乙個正整數,...