http://www.cnblogs.com/zhangchaoyang/articles/2012070.html
把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算。
约定:字符串S去掉最后一个字符T后为S‘,T1和T2分别是S1和S2的最后一个字符。
则dist(S1,S2)是下列4个值的最小者:
1.dist(S1‘,S2‘)--当T1==T2
2.1+dist(S1‘,S2)--当T1!=T2,并且删除S1的最后一个字符T1
3.1+dist(S1,S2‘)--当T1!=T2,并且在S1后面增加一个字符T2
4.1+dist(S1‘,S2‘)--当T1!=T2,并且把S1的最的一个字符T1改成T2
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cstring> #include<queue> using namespace std; const int maxn=500; const int inf=0x3f3f3f3f; const int chart=26; typedef unsigned long long ll; int dp[maxn][maxn]; char s1[500],s2[500]; int main(){ int m,n; while(scanf("%s%s",s1,s2)!=EOF){ n=strlen(s1);m=strlen(s2); memset(dp,0x3f,sizeof(dp)); for(int i = 0;i<=max(m,n);i++) dp[0][i]=dp[i][0]=i; for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++){ if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]; dp[i][j]=min(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]+1); } printf("%d\n",dp[n][m]); } return 0; }
最长公共子串
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cstring> #include<queue> using namespace std; const int maxn=500; const int inf=0x3f3f3f3f; const int chart=26; typedef unsigned long long ll; int dp[maxn]; char s1[500],s2[500]; int main(){ int m,n; while(scanf("%s%s",s1,s2)!=EOF){ int ans=0; n=strlen(s1);m=strlen(s2); memset(dp,0,sizeof(dp)); for(int i = 1;i<=n;i++) for(int j = m;j;j--){ if(s1[i-1]==s2[j-1]) dp[j]=dp[j-1]+1; else dp[j]=0; ans=max(ans,dp[j]); } printf("%d\n",ans); } return 0; }
时间: 2024-10-14 00:53:27