题目:
链接:https://www.luogu.com.cn/problem/P2758
思路:
使用动态规划思想
根据题目可得 题目要求为要用最少的字符操作次数,将字符串 A 转换为字符串 B
dp[i]定义为 从A[i]转换成B[j]的最小步数的集合
dp状态为min
这题有四个状态
1 不用操作;
2 删除一个字符;
3 插入一个字符;
4 将一个字符改为另一个字符。
dp[i][j]状态转移为: dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);
代码:
#includeusing namespace std; const int maxn=1e4+5; int dp[maxn][maxn]; int main() { int n,m; string s,t; cin >> s >> t; n=s.size(); m=t.size(); int maxs=0; for(int i=1;i<=n;i++) dp[i][0]=i; for(int i=1;i<=m;i++) dp[0][i]=i; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s[i-1]==t[j-1])//不用修改的情况 dp[i][j]=dp[i-1][j-1]; else dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);//不相等的情况 } } cout << dp[n][m]; return 0; }



