Problem of The Day: Find the Maximum Length of Valid Subsequence I
Problem Statement
Brute Force [TLE]
Memoization Attempt
from collections import defaultdict
from typing import List
class Solution:
def maximumLength(self, nums: List[int]) -> int:
N = len(nums)
memo = defaultdict(int)
def dfs(i: int, parity: int, length: int) -> int:
key = (i, parity, length)
if key in memo:
return memo[key]
max_len = length
for j in range(i + 1, N):
next_parity = (nums[i] + nums[j]) % 2
if next_parity == parity:
max_len = max(max_len, dfs(j, parity, length + 1))
memo[key] = max_len
return max_len
max_length = 0
for i in range(N - 1):
for j in range(i + 1, N):
parity = (nums[i] + nums[j]) % 2
max_length = max(max_length, dfs(j, parity, 2)) # Start with a pair
return max_length
DP Approach Attempt
from typing import List
class Solution:
def maximumLength(self, nums: List[int]) -> int:
n = len(nums)
dp = [[1] * 2 for _ in range(n)] # dp[i][0] for even parity chain, dp[i][1] for odd parity chain
max_len = 1
for i in range(n):
for j in range(i):
parity = (nums[i] + nums[j]) % 2
dp[i][parity] = max(dp[i][parity], dp[j][parity] + 1)
max_len = max(max_len, dp[i][parity])
return max_len if max_len >= 2 else 0 # Only count chains with 2+ elements
Editorial
class Solution:
def maximumLength(self, nums: List[int]) -> int:
res = 0
for pattern in [[0, 0], [0, 1], [1, 0], [1, 1]]:
cnt = 0
for num in nums:
if num % 2 == pattern[cnt % 2]:
cnt += 1
res = max(res, cnt)
return res