使用递归实现,但是计算了重复的子问题,所以采用记忆化方法,将子问题的解保存在一个数组里。
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int ans[100][100][100][100];
int mmin(int a,int b,int c)
{
a=a<b?a:b;
a=a<c?a:c;
return a;
}
int caldis(string a,int pabegin,int paend,string b,int pbbegin,int pbend)
{
if(pabegin>paend){
if(pbbegin>pbend)return 0;
else return ans[pabegin][paend][pbbegin][pbend]=pbend-pbbegin+1;
}
if(pbbegin>pbend){
if(pabegin>paend)return 0;
else return ans[pabegin][paend][pbbegin][pbend]=paend-pabegin+1;
}
if(a[pabegin]==b[pbbegin]){
if(ans[pabegin+1][paend][pbbegin+1][pbend]!=-1)return ans[pabegin+1][paend][pbbegin+1][pbend];
else return ans[pabegin+1][paend][pbbegin+1][pbend]=caldis(a,pabegin+1,paend,b,pbbegin+1,pbend);
}
else {
int t1;
if(ans[pabegin][paend][pbbegin+1][pbend]!=-1)t1=ans[pabegin][paend][pbbegin+1][pbend];
else t1=caldis(a,pabegin,paend,b,pbbegin+1,pbend);
int t2;
if(ans[pabegin+1][paend][pbbegin][pbend]!=-1)t2=ans[pabegin+1][paend][pbbegin][pbend];
else t2=caldis(a,pabegin+1,paend,b,pbbegin,pbend);
int t3;
if(ans[pabegin+1][paend][pbbegin+1][pbend]!=-1)t3=ans[pabegin+1][paend][pbbegin+1][pbend];
else t3=caldis(a,pabegin+1,paend,b,pbbegin+1,pbend);
return mmin(t1,t2,t3)+1;
}
}
int main()
{
string s1="xabfa",s2="xafadfa";
int len1=s1.size(),len2=s2.size();
memset(ans,-1,sizeof(ans));
cout<<caldis(s1,0,len1-1,s2,0,len2-1)<<endl;
return 0;
}