动态规划 04 (公共子序列)

来源:互联网 发布:数据挖掘及应用是什么 编辑:程序博客网 时间:2024/05/29 11:37

04 公共子序列

给两个字符串,求两个字符串的最长的公共子字符串。

用dp【i】【j】表示s的第 i个字符与ss的第 j个字符的子序列长度,要注意s,ss是从【0】开始的,所以dp【i】【j】实际上是s【i-1】与ss【j-1】的结果。

公式:当s【i-1】==ss【j-1】时, dp【i】【j】=dp【i-1】【j-1】+1;

不等于时,dp【i】【j】=max{dp【i】【j-1】,dp【i-1】【j】}。

代码如下:


#include<bits/stdc++.h>using namespace std;  int main()  {      char s[250],ss[250];      while(cin>>s>>ss)      {          int dp[250][250];             int i,j,l,ll;          l=strlen(s);          ll=strlen(ss);          for(i=0;i<l;i++)          dp[i][0]=0;                        for(j=0;j<ll;j++)        dp[0][j]=0;                                 for(i=1;i<=l;i++)        for(j=1;j<=ll;j++)        {             if(s[i-1]==ss[j-1]) dp[i][j]=dp[i-1][j-1]+1;              else           dp[i][j]=max(dp[i][j-1],dp[i-1][j]);        }          cout<<dp[l][ll]<<endl;      }      return 0;  }  

0 0
原创粉丝点击