题目链接: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()]; }