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