51nod 1183 编辑距离

来源:互联网 发布:水杨酸洗面奶 知乎 编辑:程序博客网 时间:2024/06/05 15:53

dp问题,类似于LCS

开个大数组存一下分别截止到i,j,两个子字符串的最短距离

然后对于两个m,n长的字串,如果末尾相同,那距离就是dp[i-1][j-1]

如果末尾不同,那距离就是min(a[i-1][j],a[i][j-1],a[i-1][j-1])+1,考虑这三个式子的意义,分别是刨去了末尾元素i,刨去了末尾元素j,和将末尾元素替换为相同值,耗费距离都是1。


代码里打印了数组,交oj的时候注释掉。

//@auther zhou//@Number 201408070203//@start time://@finish time:/*@此处注意:*//* 测试数据*/#include<iostream>#include<cstring>#include<vector>#include<cmath>#include<algorithm>using namespace std;int dp[1005][1005]={0};int main(){string a,b;cin>>a>>b;int lofa=a.size(),lofb=b.size();for(int i=0;i<=lofa;i++){for(int j=0;j<=lofb;j++){if((!i)||(!j)){dp[i][j]=max(i,j);}else {dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(a[i-1]==b[j-1]? 0:1));//dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(a[i]==b[j]? 0:1) );}}}for(int i=0;i<=lofa;i++){//cout<<i<<" ";for(int j=0;j<=lofb;j++){cout<<dp[i][j]<<" ";}cout<<endl;}cout<<dp[lofa][lofb];return 0;}


0 1
原创粉丝点击