动态规划经典例题(二)
最长公共子列:
   
输入:
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  
                    
                

                
            
        
浙公网安备 33010602011771号