动态规划经典例题(二)

最长公共子列:

   

 

 

输入:

       Abcfbc  abfcab

       Programming  contest

       Abcd  mnp

输出:

       4

       2

       0

 

解题思路:

       和最求最长上升子列一样,先设定一个数组存储比较过的状态maxlen[][],一步步的从子问题推到最终问题

       设一个二维数组maxlen[][]

最长公共子串

a

d

c

b

a

1

1

1

1

b

1

1

1

2

c

1

1

2

2

d

1

2

2

1

       取一个子串内的字母,和另一个子串依次比较

        

 

  代码如下

    

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 char s1[1000],s2[1000];//两个字符数组
 6 int maxlen[1000][1000];//计数数组
 7 
 8 int main()
 9 {
10     int i,j;
11     while(cin>>s1>>s2)//输入两个数组,作为开始 
12     {
13         int m = strlen(s1);
14         int n = strlen(s2);
15         
16         //表格初始化 
17         for(i=1;i<=m;i++)
18             maxlen[i][0]=0;
19         for(j=1;j<=n;j++)
20             maxlen[0][j]=0;
21             
22         //取一个数组,一个个的跟另一个数组从头到尾比较
23         for(i=1;i<=m;i++) 
24         {
25             for(j=1;j<=n;j++)
26                 if(s1[i]==s2[j])
27                     maxlen[i][j]=maxlen[i-1][j-1]+1;
28                 else
29                     maxlen[i][j]=max(maxlen[i-1][j],maxlen[i][j-1]);
30                 
31         }    
32         
33         cout<<maxlen[m][n];    
34     }
35     
36     
37     
38     
39     
40     
41     return 0;
42 } 
43  
View Code

 

 

      

posted @ 2020-02-16 21:42  PRINT王哲  阅读(156)  评论(0编辑  收藏  举报
Live2D