原題傳送門
自己動手敲的第一道二維DP題目(盡管偷偷翻了一下算法書),心情很美麗。
思路
設dp[i][j]表示X[i]與Y[j]的編輯距離.
那么,可以進行三種操作:
插入x[i](等同於刪除y[j]),那么dp[i][j]就等於dp[i-1][j]+1.
插入x[i](等同於刪除y[j]),那么dp[i][j]就等於dp[i-1][j]+1.
將x[i]替換成yj.
運用貪心,得到狀態轉移方程為:
dp[i][j]=min{dp[i-1][j]+1,dp[i-1][j]+1,dp[i-1][j-1]+(x[i]!=y[j])}
剩下的就是混代碼了,不再贅述。
Code
#include<iostream>
#include<string>
using namespace std;
string A,B;
int dp[2001][2001];
int min(int a,int b,int c)
{
if(a<=b&&a<=c)
return a;
if(b<=a&&b<=c)
return b;
if(c<=a&&c<=b)
return c;
}
int main()
{
//freopen("testdata.in","r",stdin);
cin>>A>>B;
for(int i=1;i<=A.size();i++)
{
dp[i][0]=i;
}
for(int j=1;j<=B.size();j++)
{
dp[0][j]=j;
}
for(int i=1;i<=A.size();i++)
{
for(int j=1;j<=B.size();j++)
{
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(A[i-1]!=B[j-1]));
}
}
/*
生成DP表格以便調試
cout<<" "<<B<<endl;
for(int i1=1;i1<=A.size();i1++)
{
cout<<A[i1-1];
for(int j1=1;j1<=B.size();j1++)
{
cout<<dp[i1][j1];
}
cout<<endl;
}
cout<<endl;
*/
cout<<dp[A.size()][B.size()];
return 0;
}