Advertisement
viligen

longest_zigzag_subs_DP

Aug 10th, 2022
705
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.11 KB | None | 0 0
  1. from collections import deque
  2.  
  3. nums = [int(x) for x in input().split()]
  4. dp = [[0] * len(nums) for _ in range(2)]
  5.  
  6. parent = [[None] * len(nums) for _ in range(2)]
  7.  
  8. dp[0][0] = dp[1][0] = 1
  9. best_size = 0
  10. best_col = 0
  11. best_row = 0
  12. for current in range(1, len(nums)):
  13.     curr_num = nums[current]
  14.  
  15.     for prev in range(current - 1, -1, -1):
  16.         prev_num = nums[prev]
  17.  
  18.         if curr_num > prev_num and dp[1][prev] + 1 >= dp[0][current]:
  19.             dp[0][current] = dp[1][prev] + 1
  20.             parent[0][current] = prev
  21.         if curr_num < prev_num and dp[0][prev] + 1 >= dp[1][current]:
  22.             dp[1][current] = dp[0][prev] + 1
  23.             parent[1][current] = prev
  24.     if dp[0][current] > best_size:
  25.         best_size = dp[0][current]
  26.         best_row = 0
  27.         best_col = current
  28.     if dp[1][current] > best_size:
  29.         best_size = dp[1][current]
  30.         best_row = 1
  31.         best_col = current
  32.  
  33. result = deque()
  34.  
  35. while best_col is not None:
  36.     result.appendleft(nums[best_col])
  37.     best_col = parent[best_row][best_col]
  38.     best_row = 1 if best_row == 0 else 0
  39.  
  40. print(*result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement