Time Limit: 2000/1000 MS 
(Java/Others)    Memory Limit: 65536/32768 K 
(Java/Others)
Total Submission(s): 1360    Accepted 
Submission(s): 672
Special 
Judge
 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 int dp[1001][1001];
 5 int f[1001][1001];
 6 char a[1000],b[1000];
 7 int l1,l2;
 8 int Length(char a[])    //返回一字符串长度 
 9 {
10     int i;
11     for(i=0;a[i]!=‘\0‘;i++);
12     return i;
13 }
14 void lcs_pre(char a[],char b[])    //进行标记 
15 {
16     l1 = Length(a);
17     l2 = Length(b);
18     for(int i=0;i<=l1;i++){
19         dp[i][0] = 0;
20         f[i][0] = 3;
21     }
22     for(int i=0;i<=l2;i++){
23         dp[0][i] = 0;
24         f[0][i] = 1;
25     }
26     for(int i=1;i<=l1;i++)
27         for(int j=1;j<=l2;j++){
28             if( a[i-1]==b[j-1] ){
29                 dp[i][j] = dp[i-1][j-1] + 1;
30                 f[i][j] = 2;
31             }
32             else if( dp[i][j-1]>=dp[i-1][j] ){
33                 dp[i][j] = dp[i][j-1];
34                 f[i][j] = 1; 
35             }
36             else{
37                 dp[i][j] = dp[i-1][j];
38                 f[i][j] = 3;
39             }
40         }
41 }
42 void Print(int x,int y)    //输出结果字符串 
43 {
44     if(x==0 && y==0)
45         return ;
46     switch(f[x][y]){
47         case 1:
48             Print(x,y-1);
49             cout<<b[y-1];
50             break;
51         case 2:
52             Print(x-1,y-1);
53             cout<<a[x-1];
54             break;
55         case 3:
56             Print(x-1,y);
57             cout<<a[x-1];
58             break;
59         default:break;
60     }
61     return ;
62 }
63 int main()
64 {
65     while(cin>>a>>b){ 
66         l1 = Length(a);
67         l2 = Length(b);
68         lcs_pre(a,b);    //进行标记
69         Print(l1,l2);
70         cout<<endl;
71     }
72     return 0;
73 }
Freecode : www.cnblogs.com/yym2013
hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)
原文:http://www.cnblogs.com/yym2013/p/3532951.html