LCS与打印路径
/* LCS */ #include<bits/stdc++.h> using namespace std; const int maxn = 1000; int dp[maxn][maxn], c[maxn][maxn]; int str1[maxn],str2[maxn]; int k; void dfs(int i,int j){ //打印路径 if(i == 0 || j == 0) return; if(c[i][j] == 1){ dfs(i-1,j-1); k--; printf("%d%c",str1[i],k > 0 ? ' ':'\n'); }else if(c[i][j] == 2){ dfs(i-1,j); }else{ dfs(i,j-1); } } int main(){ int n,m; while(scanf("%d",&n)!=EOF){ for(int i = 1; i <= n; i++){ scanf("%d",&str1[i]); } scanf("%d",&m); for(int i = 1; i <= m; i++){ scanf("%d",&str2[i]); } for(int i = 1; i <= n; ++i){ for(int j = 1; j <= m; j++){ if(str1[i] == str2[j]){ dp[i][j] = dp[i-1][j-1] + 1; c[i][j] = 1; }else if(dp[i-1][j] > dp[i][j-1]){ dp[i][j] = dp[i-1][j]; c[i][j] = 2; }else{ dp[i][j] = dp[i][j-1]; c[i][j] = 3; } } } printf("%d\n",dp[n][m]); k = dp[n][m]; dfs(n,m); } return 0; } /* 7 1 2 3 2 4 1 2 6 2 4 3 1 2 1 */
学学学 练练练 刷刷刷