P2758 编辑距离(DP)

P2758 编辑距离(DP)

传送门

思路:经典两个字符串匹配的 d p dp ,找到状态转移方程即可。
这里提供两种写法, d p dp ,记忆化搜索。实质一样。
p s ps: 记忆化搜索看着舒服一些。。

d p 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106626810