Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define sz(s) (int)(s).size()
- #define all(s) (s).begin(),(s).end()
- vector<int> v;
- int n;
- const int N = 1e4;
- int dp[N][301];
- int vis[N][301], vid = 0;
- static int nxt[10005][301];
- inline int get_next(int i, int val) {
- if (val<1 || val>300 || i+1>n) return -1;
- return nxt[i+1][val];
- }
- int rec(int i, int diff) {
- if (i == n || diff==-1)return 0;
- int &ret = dp[i][diff];
- if (vis[i][diff] == vid)return ret;
- vis[i][diff] = vid;
- ret = 0;
- if (diff == 300)ret = max(ret, rec(i + 1, diff));
- ret=max(ret,rec(i,diff-1));
- int next1 = get_next(i, v[i] + diff);
- int next2 = get_next(i, v[i] - diff);
- if (next1 != -1) ret = max(ret, rec(next1, diff) + 1);
- if (next2 != -1 && next2 != next1) ret = max(ret, rec(next2, diff) + 1);
- return ret;
- }
- class Solution {
- public:
- static int longestSubsequence(vector<int> &nums) {
- vid++;
- v = nums;
- n = sz(nums);
- for (int v=1; v<=300; ++v) nxt[n][v] = -1;
- for (int i=n-1; i>=0; --i) {
- memcpy(nxt[i], nxt[i+1], 301*sizeof(int));
- nxt[i][nums[i]] = i;
- }
- return rec(0,300)+1;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment