题意:
输入:输入n,m,其分别为两个字符串的长度,比如这两个字符串是abcd, becd。
输出:3("bcd"是它们的最长子序列)
思路:如果当前相同下标的字符相等的话,那么dp[i + 1][j + 1] = dp[i][j] + 1;//下一段就是多了一段
否则dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]);//下一段最长的二中选最长
/* 输入: 4 4 abcd becd 输出: 3("bcd") */ #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int main(){ int n, m; while(scanf("%d%d", &n, &m) != EOF){ const int N = n, M = m; char s[N], t[M]; int dp[N + 1][M + 1]; memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++) scanf(" %c", &s[i]); for(int i = 0; i < m; i++) scanf(" %c", &t[i]); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(s[i] == t[j]){ dp[i + 1][j + 1] = dp[i][j] + 1; }else{ dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]); } } } printf("%d\n", dp[n][m]); } return 0; }