AhmedAshraff

Untitled

Sep 12th, 2025
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.14 KB | None | 0 0
  1. #define sz(s) (int)(s).size()
  2. #define all(s) (s).begin(),(s).end()
  3.  
  4. vector<int> v;
  5. int n;
  6. const int N = 1e4;
  7. int dp[N][301];
  8. int vis[N][301], vid = 0;
  9. static int nxt[10005][301];
  10. inline int get_next(int i, int val) {
  11.     if (val<1 || val>300 || i+1>n) return -1;
  12.     return nxt[i+1][val];
  13. }
  14. int rec(int i, int diff) {
  15.     if (i == n || diff==-1)return 0;
  16.     int &ret = dp[i][diff];
  17.     if (vis[i][diff] == vid)return ret;
  18.     vis[i][diff] = vid;
  19.     ret = 0;
  20.     if (diff == 300)ret = max(ret, rec(i + 1, diff));
  21.     ret=max(ret,rec(i,diff-1));
  22.     int next1 = get_next(i, v[i] + diff);
  23.     int next2 = get_next(i, v[i] - diff);
  24.     if (next1 != -1) ret = max(ret, rec(next1, diff) + 1);
  25.     if (next2 != -1 && next2 != next1) ret = max(ret, rec(next2, diff) + 1);
  26.  
  27.     return ret;
  28. }
  29.  
  30. class Solution {
  31. public:
  32.      static int longestSubsequence(vector<int> &nums) {
  33.         vid++;
  34.         v = nums;
  35.         n = sz(nums);
  36.         for (int v=1; v<=300; ++v) nxt[n][v] = -1;
  37.      for (int i=n-1; i>=0; --i) {
  38.     memcpy(nxt[i], nxt[i+1], 301*sizeof(int));
  39.     nxt[i][nums[i]] = i;
  40.     }
  41.         return rec(0,300)+1;
  42.     }
  43. };
Advertisement
Add Comment
Please, Sign In to add comment