题目大意:两种操作:修改/删除一个字符,操作所需要的次数定义为两个字符串的距离,求最小距离
思路参考:点击打开链接
一开始想复杂了,以为删除则会导致后续序列发生改变,把删除的次数作为第三维度的状态。后来发现不需要。因为删除一个字符之后相当于回到dp[i-1][j]的状态或者dp[i][j-1]的状态,而i,j是继续向后递加的。相当于略过第a[i]或者b[j]了,下一个比较a[i+1]or b[j+1],不需前移什么的。。。
注意:所有a.length()-1, a[a.length()-1]是最后一个字符
#include<iostream> #include<algorithm> #include<string.h> #include<string> using namespace std; int dp[1001][1001]={0}; void solve() { int i,j; string a,b; memset(dp,0,sizeof(dp)); cin>>a;cin>>b; a=" "+a;b=" "+b; for (i=0;i<=a.length()-1;i++) dp[i][0]=i; for (i=0;i<=b.length()-1;i++) dp[0][i]=i; for (i=1;i<=a.length()-1;i++) for (j=1;j<=b.length()-1;j++) if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]; else //修改a 删除a 删除b dp[i][j]=min(dp[i-1][j-1]+1, min(dp[i-1][j]+1,dp[i][j-1]+1) ); cout<<dp[a.length()-1][b.length()-1]<<endl; return ; } int main() { int t; cin>>t; while(t--) solve(); return 0; }