傳送門
這道題,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] = dp[i][j - 1] + 1;
三者選擇維護一種最小的值就行。
即dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1])+ 1;
初始話部分:
dp[0][i] = i ;代表新增i個字元的最小操作次數
dp[i][0] = i;代表刪除i個字元的最小操作次數
**部分:
#include
using
namespace std;
const
int n =
2e3+10;
char s1[n]
;char s2[n]
;int dp[n]
[n];
intmain()
for(
int i =
1; i <= m; i++
)for
(int i =
1; i <= n; i++
)else}}
cout << dp[n]
[m]<< endl;
return0;
}
編輯距離(洛谷 P2758 )
洛谷 p2758 編輯距離 題目描述 設a和b是兩個字串。我們要用最少的字元操作次數,將字串a轉換為字串b。這裡所說的字元操作共有三種 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元 皆為小寫字母!輸入輸出格式 輸入格式 第一行為字串a 第二行為字串b 字串a和b的長度均小於200...
洛谷 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。輸出格式 只有乙個正整數,...