题目链接:https://www.lanqiao.cn/problems/1507/learning/

一道小小思维的dp题

要弄明白  3个  操作对应的  数据的位置

先说说为什么要从i+1  j+1  开始计算呢,因为我们初始化默认第一个元素相等更容易操作

其实如果从i j开始计算的话,需要考虑下首元素相不相等,所以这里就从i+1,j+1开始了

3个操作,分别对应

相对于i+1,j+1来说

i,j --- 变换一个数

i+1,j --- 删除一个数

i,j+1 --- 插入一个数

这个对应  感觉应该也不难想到,  i+1,j+1 我们就取一个最优的结果就OK啦

上代码


#include<bits/stdc++.h>
using namespace std;
int f[2005][2005];
int main()
{
	string a;
	string b;
	int i,j;
	cin>>a>>b;
	for(i=0;i<a.size();i++)
	{
		f[i][0]=i;
	}
	for(i=0;i<b.size();i++)
	{
		f[0][i]=i;
	}
	for(i=0;i<a.size();i++)
	{
		for(j=0;j<b.size();j++)
		{
			if(a[i]==b[j])
				f[i+1][j+1]=f[i][j];
			else{//插入一个数  ,  变换一个数  ,  删除一个数 
				f[i+1][j+1]=min(min(f[i][j+1],f[i][j]),f[i+1][j])+1;
			}
		}
	} 
/*	for(i=0;i<a.size();i++)
	{
		for(j=0;j<b.size();j++)
		{
			cout<<f[i][j]<<' ';
		}
		cout<<endl;
	}*/
	cout<<f[a.size()][b.size()];
}