最长公共子序列法做,但我感觉相对于LIS不太好理解,先敲个代码
状态转移函数
A[i] = A[j], dp[i] = max(dp[i - 1][j], dp[i][j - 1]) + 1 A[i] != A[j], dp[i] = max(dp[i - 1][j], dp[i] [j - 1])
代码
#include<cstdio>#include<algorithm>using namespace std;const int maxc = 210;const int maxn = 10010;int A[maxc], B[maxn], dp[maxc][maxn];int main(){int n, m;scanf("%d %d", &n, &m);for(int i = 1; i <= m; i++){scanf("%d",&A[i]);}int L;scanf("%d", &L);for(int i = 1; i <= L; i++){scanf("%d", &B[i]);}for(int i = 0; i <= m; i++) dp[i][0] = 0;for(int i = 0; i <= L; i++) dp[0][j] = 0;for(int i = 1; i <= m; i++){for(int j = 1; j < L; j++){int MAX = max(dp[i][j - 1], dp[i - 1][j]);if(A[i] == A[j]) dp[i][j] = MAX + 1;else dp[i][j] = MAX;}}printf("%d", dp[m][L]);return 0;}
