题目链接:http://poj.org/problem?id=1458
题目大意:求两个字符串的公共子序列的最长长度
解题思路:简单dp
1 /////////////////////////////////////////////////////////////////////////// 2 //problem_id: poj 1458 3 //user_id: SCNU20102200088 4 /////////////////////////////////////////////////////////////////////////// 5 6 #include <algorithm> 7 #include <iostream> 8 #include <iterator> 9 #include <iomanip> 10 #include <cstring> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cstdio> 15 #include <cctype> 16 #include <cmath> 17 #include <queue> 18 #include <stack> 19 #include <list> 20 #include <set> 21 #include <map> 22 using namespace std; 23 24 /////////////////////////////////////////////////////////////////////////// 25 typedef long long LL; 26 const double PI=acos(-1.0); 27 /////////////////////////////////////////////////////////////////////////// 28 29 /////////////////////////////////////////////////////////////////////////// 30 //Add Code: 31 int max(int a,int b){ 32 return a>b? a:b; 33 } 34 /////////////////////////////////////////////////////////////////////////// 35 36 int main(){ 37 /////////////////////////////////////////////////////////////////////// 38 //Add code: 39 string a,b; 40 while(cin>>a>>b){ 41 int alen=a.size(),blen=b.size(),i,j,dp[256][256]; 42 memset(dp,0,sizeof(dp)); 43 for(i=1;i<=alen;i++){ 44 for(j=1;j<=blen;j++){ 45 if(a[i-1]==b[j-1]) dp[i][j]=max(dp[i][j],1+dp[i-1][j-1]); 46 else dp[i][j]=max(dp[i][j],max(dp[i-1][j],dp[i][j-1])); 47 } 48 } 49 cout<<dp[alen][blen]<<endl; 50 } 51 /////////////////////////////////////////////////////////////////////// 52 return 0; 53 } 54 55 /////////////////////////////////////////////////////////////////////////// 56 /* 57 Testcase: 58 Input: 59 abcfbc abfcab 60 programming contest 61 abcd mnp 62 Output: 63 4 64 2 65 0 66 */ 67 ///////////////////////////////////////////////////////////////////////////