P2758 编辑距离(DP)
思路:经典两个字符串匹配的
,找到状态转移方程即可。
这里提供两种写法,
,记忆化搜索。实质一样。
记忆化搜索看着舒服一些。。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+5;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
inline void read(int &x){
x=0;int w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
for(;ch>='0'&&ch<='9';ch=getchar())
x=(x<<3)+(x<<1)+(ch&15);
x*=w;
}
int dp[N][N];
int main(){
string a,b;
cin>>a>>b;
int la=a.size(),lb=b.size();
for(int i=0;i<=la;i++) dp[i][0]=i;
for(int j=0;j<=lb;j++) dp[0][j]=j;
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;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])});
printf("%d\n",dp[la][lb]);
return 0;
}
记忆化搜索代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+5;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
inline void read(int &x){
x=0;int w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
for(;ch>='0'&&ch<='9';ch=getchar())
x=(x<<3)+(x<<1)+(ch&15);
x*=w;
}
int dp[N][N],n;
char a[N],b[N];
int dfs(int i,int j){
if(dp[i][j]) return dp[i][j];
if(!i) return dp[i][j]=j;
if(!j) return dp[i][j]=i;
return dp[i][j]=min({dfs(i-1,j)+1,dfs(i,j-1)+1,dfs(i-1,j-1)+(a[i]!=b[j])});
}
int main(){
scanf("%d",&n);
scanf("%s%s",a+1,b+1);
printf("%d\n",dfs(strlen(a+1),strlen(b+1)));
return 0;
}