标签:
解题思路:先注意到序列和串的区别,序列不需要连续,而串是需要连续的,先由样例abcfbc abfcab画一个表格分析,用dp[i][j]储存当比较到s1[i],s2[j]时最长公共子序列的长度
a b f c a b
0 0 0 0 0 0 0
a 0 1 1 1 1 1 1
b 0 1 2 2 2 2 2
c 0 1 2 2 3 3 3
f 0 1 2 3 3 3 3
b 0 1 2 3 3 3 4
c 0 1 2 3 4 4 4
其中 s1 abcfbc
s2 abfcab
以s1中的a来分析,用它与s2中的字母比较,如果相同,那么dp[i][j]=dp[i-1][j-1]+1(遇到相同的字母公共子序列的长度增加1)
如果不同的话,dp[i][j]=max(dp[i-1][j],dp[i][j-1]) (即取相邻两种情况中的最大值)
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39737 | Accepted: 15977 |
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
#include<stdio.h> #include<string.h> #define maxn 10010 int dp[maxn][maxn]; int max(int a,int b) { if(a>b) return a; else return b; } int main() { char s1[maxn],s2[maxn]; int len1,len2,i,j; while(scanf("%s %s",&s1,&s2)!=EOF) { len1=strlen(s1); len2=strlen(s2); for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } printf("%d\n",dp[len1][len2]); } }
POJ 1458 Common Subsequence 【最长公共子序列】
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4175044.html