我開始讀題的時候以為弄錯提了。。看來讀題還是有待提高
題意是 給定兩個串,乙個a,b,讓a變成b
有兩種操作 1 增加乙個字元
2 減少乙個字元
3 轉換乙個字元
每一次操作算一次運算元,
問你最小的運算元
在華南農業大學的acm群裡有人問這道題,後來翻了翻,還是挺有意思的,開始以為是最長公共子串,後來大神說有修改最長公共子串毛啊,還發了wiki的連線,大致分為三種
dp[i][j]表示從 a串中i長的子串 到 b串中j長的字串的變化需要運算元。
不怎麼顯然的是,如果i,j有乙個為0,那麼運算元就是 不為0的那個數,j或者i;
否則的話有 狀態轉移方程如**。
具體看 方程
poj不支援 bits/stdc++ …
//#include
#include
#include
#include
using namespace std;
const int maxn=1005;
//是乙個dp的題,因為有修改操作,所以不是
//最長公共子串這麼簡單的事情啊
/*並且驚奇的發現乙個規律,那就是兩個串相互轉化,操作一樣,
設定dp[i][j],長度為i的子串1 變成長度為j 的子串2 所花費的。
1 當有i和j有乙個為1時,那麼就等於那個不為1的+f[i][j];
(很簡單啊,你只能刪啊或者加啊(逆向))
如果在中間呢,考慮乙個 dp狀態方程吧
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+f[i][j];
*/int a1,b1;
char a[maxn],b[maxn];
int f[maxn][maxn];
int dp[maxn][maxn];
int dp()
cout
<<"**************"
i=1;i<=a1;i++)
//初始化一樣吧,就是這個套路。
for(int
i=1;i<=b1;i++)
dp[0][i]=i;
for(int
i=1;i<=a1;i++)
}/*for(int
i=0;i*/
cout
<}int
main()
return 0;
}
編輯距離 poj 3356
include define n 1002 char src null,des null int m,n int dis n n main int i,j,k while scanf d m eof src char malloc sizeof char m 1 scanf s src scanf ...
poj 3356 求最短編輯距離
題目大意 給定兩個字串x,y,要你求出x經過插入,刪除,替換變成y所要的最少操作,即編輯距離。當x i y j 時,i和j不需要編輯,要麼刪除,要麼插入,要麼替換 dp i j min dp i 1 j 1 dp i 1 j 1,dp i j 1 1 當x i y i 時,i和j不需要編輯 dp i...
POJ3356 AGTC 題解 最短編輯距離問題
題目大意 求 由字串 s 通過下列三種操作 插入乙個字元 刪除乙個字元 改變乙個字元 變換到字串 t 所需要的最少操作次數 亦即最短編輯距離問題 解題思路 定義狀態 f i j 表示 s 0.i 和 t 0.j 合併所需的最小花費,則可得狀態轉移方程為 字串座標從 1 開始,0 表示乙個都沒選 實現...