cin>>n>>m; for(int i = 1 ; i <= n ; i ++) cin>>a[i]; for(int i = 1 ; i <= m ; i ++) cin>>b[i]; for(int i = 1 ; i <= n ; i ++){ for(int j = 1 ; j <= m ; j ++){ if(a[i] == b[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i][j-1], dp[i-1][j]); } } cout<<dp[n][m];
求LCS序列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
vector<int > lcs; voidgetLcs(){ int i = n; int j = m; while(i&&j){ if(a[i] == a[j]){ lcs.push_back(a[i]); i--;j--; }else{ // 舍去dp值较小的末端 if(dp[i-1][j] > dp[i][j-1]) i--; else j--; } } reverse(lcs.begin(),lcs.end()); }
intbinarySearch(int l, int r, int x){ while(l+1 != r){ int mid = (l+r)/2; if(low[mid] <= x){ l = mid; }else{ r = mid; } } return r; }
intmain(void){ cin>>n; for(int i = 1 ; i <= n ; i ++){ cin>>a[i]; Hash[a[i]] = i; } for(int i = 1 ; i <= n ; i ++){ cin>>b[i]; b[i] = Hash[b[i]]; } low[++cnt] = b[1]; for(int i = 2 ; i <= n ; i ++){ if(b[i] > low[cnt]){ low[++cnt] = b[i]; }else{ int p = binarySearch(0, cnt, b[i]); low[p] = b[i]; } } cout<<cnt; return0; }