Advertisement
kosievdmerwe

1531. Incorrect

Oct 14th, 2022
868
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.55 KB | None | 0 0
  1. NOCHAR = 27
  2.  
  3. class Solution:
  4.     def getLengthOfOptimalCompression(self, s: str, k: int) -> int:
  5.         N = len(s)
  6.        
  7.         if N == k:
  8.             return 0
  9.        
  10.         s = [ord(c) - ord('a') for c in s]
  11.        
  12.         def min_(old, cand):
  13.             if old is None:
  14.                 return cand
  15.             return min(old, cand)
  16.        
  17.         def encoding_len(num_chars: int) -> int:
  18.             if num_chars <= 1:
  19.                 return num_chars
  20.             return 1 + len(str(num_chars))
  21.        
  22.         @cache
  23.         def dp(prefix_len: int, num_dels: int, last_char: int) -> Optional[Tuple[int, int]]:
  24.             if prefix_len == 0:
  25.                 return None if last_char != NOCHAR else (0, 0)
  26.            
  27.             if last_char == NOCHAR:
  28.                 return None if prefix_len > num_dels else (0, 0)
  29.            
  30.             best = None
  31.             if s[prefix_len - 1] == last_char:
  32.                 for c in range(27 + 1):
  33.                     prev_best = dp(prefix_len - 1, num_dels, c)
  34.                     if prev_best is None:
  35.                         continue
  36.                        
  37.                     if c == last_char:
  38.                         new_len = prev_best[0] - encoding_len(prev_best[1]) + encoding_len(prev_best[1] + 1)
  39.                         best = min_(best, (new_len, prev_best[1] + 1))
  40.                         continue
  41.                    
  42.                     best = min_(best, (prev_best[0] + 1, 1))
  43.            
  44.             if num_dels > 0:
  45.                 prev_best = dp(prefix_len - 1, num_dels - 1, last_char)
  46.                 if prev_best is not None:
  47.                     best = min_(best, prev_best)
  48.            
  49.             return best
  50.        
  51.         for i in range(N + 1):
  52.             print(i, 'a', dp(i, 1, 0), dp(i, 0, 0))
  53.             print(i, 'b', dp(i, 1, 1), dp(i, 0, 1))
  54.             print(i, 'N', dp(i, 1, NOCHAR), dp(i, 0, NOCHAR))
  55.             print()
  56.            
  57.         ans = max(
  58.             dp(N, k, c) for c in range(27 + 1) if dp(N, k, c) is not None
  59.         )
  60.         return ans[0]
  61.        
  62. #         # DP[prefix][num_dels][last_char] = (encoded len, num_last_char)
  63. #         dp = [[[None] * 27 for _ in range(k + 1)] for _ in range(len(s) + 1)]
  64. #         dp[0][0][NOCHAR] = (0, 0)
  65.  
  66. #         for prefix_len in range(1, N + 1):
  67. #             for dels_used in range(k):
  68. #                 pass
  69.            
  70. #         ans = max(
  71. #             dp[N][k][c] for c in range(27 + 1) if dp[N][k][c] is not None
  72. #         )
  73. #         return ans[0]
  74.        
  75.        
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement