fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define FOR(i , a , b) for(int i = a ; i <= b; i++)
  7. #define FAST ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  8. #define maxn 505
  9.  
  10. int a[maxn] , b[maxn] , dp[maxn][maxn][2] , pre[maxn][maxn][2];
  11.  
  12. int main(){
  13. FAST;
  14. int n , m;
  15. cin >> n >> m;
  16. FOR(i , 1 , n) cin >> a[i];
  17. FOR(i ,1 , m) cin >> b[i];
  18.  
  19. // goi dp[i][j][k] la do dai day bap benh chung dai nhat khi xet a[1.. i] va b[1..j]
  20. // ai > bj -> k = 1
  21. // ai < bj -> k = 0
  22. FOR(i , 1 , n){
  23. FOR(j , 1 , m){
  24. if(a[i] != b[j]) continue;
  25. int best_greater = 1;
  26. int best_less = 1;
  27.  
  28. // dp[i][j][0] = max(dp[i][j][0] , dp[i'][j'][1] + 1)
  29. // dp[i][j][1] = max(dp[i][j][1] , dp[i'][j'][0] + 1)
  30. // ta thay rang ta se xet i' < i va j' < j -> ta co dinh chieu i va opt j
  31. // -> opt j bang prefix sum
  32. // pre[i][j][0] , pre[i][j][1]
  33. // pre[i][j][0] = max(pre[i][j - 1][0] , dp[i][j][0])
  34.  
  35. FOR(id , 1 , i - 1){
  36. if(a[id] < a[i]){
  37. int cand = pre[id][j - 1][0];
  38. if(cand > 0) best_greater = max(best_greater , cand + 1);
  39. }
  40.  
  41. else if(a[id] > a[i]){
  42. int cand = pre[id][j - 1][1];
  43. if(cand > 0) best_less = max(best_less , cand + 1);
  44. }
  45. }
  46. dp[i][j][0] = best_less;
  47. dp[i][j][1] = best_greater;
  48. }
  49.  
  50. pre[i][0][0] = 0;
  51. pre[i][0][1] = 0;
  52. // sau khi build xong tung j cho hang i
  53. FOR(j , 1 , m){
  54. pre[i][j][0] = max(pre[i][j - 1][0] , dp[i][j][0]);
  55. pre[i][j][1] = max(pre[i][j - 1][1] , dp[i][j][1]);
  56. }
  57. }
  58.  
  59. int ans = 0;
  60. FOR(i , 1 , n){
  61. FOR(j , 1 , m){
  62. ans = max({ans , dp[i][j][0] , dp[i][j][1]});
  63. }
  64. }
  65.  
  66. cout << ans;
  67. }
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
Standard output is empty