C - Common Subsequence
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a strictly increasing sequence <i1, i2, ..., ik> of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = <a, b, f, c> is a subsequence of X = <a, b, c, f, b, c> with index sequence <1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
Input
abcfbc abfcab programming contest abcd mnp
Output
4 2 0
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
题意:最长上升子序列
思路:基础线性DP
状态:DP【i】【j】表示截至字符串s1前i个元素,字符串s2前j个元素最长上升子序列
目标:MAX(DP【i】【j】)
状态转移:if(s1[i]==s2[k]) dp[i][k]=max(dp[i][k],dp[i-1][k-1])+1;
else dp[i][k]=max(dp[i-1][k],dp[i][k-1]);
决策:s1【i】与s2【j】是否相等
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #define ll long long int using namespace std; int dp[1005][1005]; char s1[1005],s2[1005]; int main() { while(scanf("%s%s",s1+1,s2+1)!=EOF) { memset(dp,0,sizeof(dp));//初始化 int ss1=strlen(s1+1),ss2=strlen(s2+1); int MAX=-1; for(int i=1;i<=ss1;i++) for(int k=1;k<=ss2;k++) { if(s1[i]==s2[k]) dp[i][k]=max(dp[i][k],dp[i-1][k-1])+1; else dp[i][k]=max(dp[i-1][k],dp[i][k-1]); MAX=max(MAX,dp[i][k]); } cout<<MAX<<endl; } return 0; }