Skip to content

Commit 9e9f870

Browse files
committed
dp
1 parent 67f5a11 commit 9e9f870

4 files changed

+146
-0
lines changed

leetcode/last_stone_weight_ii.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# https://leetcode.com/problems/last-stone-weight-ii/
2+
3+
4+
class Solution:
5+
# brute force 1
6+
def lastStoneWeightII(self, stones: list[int]) -> int:
7+
def dfs(weights: tuple[int]) -> int:
8+
if len(weights) == 1:
9+
return weights[0]
10+
11+
return min(
12+
dfs(
13+
weights[:i]
14+
+ weights[i + 1 : j]
15+
+ weights[j + 1 :]
16+
+ (abs(m - weights[j]),)
17+
)
18+
for i, m in enumerate(weights)
19+
for j in range(i + 1, len(weights))
20+
)
21+
22+
return dfs(tuple(stones))
23+
24+
# brute force 2
25+
def lastStoneWeightII(self, stones: list[int]) -> int:
26+
n = len(stones)
27+
total_weight = sum(stones)
28+
29+
def get_weight(group: int) -> int:
30+
return sum(stones[i] for i in range(n) if (1 << i) & group)
31+
32+
return min(
33+
abs(total_weight - 2 * get_weight(group))
34+
for group in range((1 << n) // 2 + 1)
35+
)
36+
37+
# dp
38+
def lastStoneWeightII(self, stones: list[int]) -> int:
39+
total_weight = sum(stones)
40+
dp = {0}
41+
42+
for stone in stones:
43+
dp |= {stone + weight for weight in dp}
44+
45+
return min(abs(total_weight - 2 * weight) for weight in dp)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# https://leetcode.com/problems/longest-arithmetic-subsequence-of-given-difference/
2+
3+
from collections import defaultdict
4+
5+
6+
class Solution:
7+
# brute force
8+
def longestSubsequence(self, arr: list[int], difference: int) -> int:
9+
dp = [1] * (n := len(arr))
10+
11+
for i in reversed(range(n - 1)):
12+
dp[i] = max(
13+
[1 + dp[j] for j in range(i + 1, n) if arr[j] - arr[i] == difference],
14+
default=1,
15+
)
16+
17+
return max(dp)
18+
19+
# dp
20+
def longestSubsequence(self, arr: list[int], difference: int) -> int:
21+
dp = defaultdict(int)
22+
longest = 1
23+
24+
for n in reversed(arr):
25+
dp[n] = dp[n + difference] + 1
26+
longest = max(dp[n], longest)
27+
28+
return longest
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# https://leetcode.com/problems/longest-increasing-subsequence/
2+
3+
4+
import bisect
5+
6+
7+
class Solution:
8+
# brute force
9+
def lengthOfLIS(self, nums: list[int]) -> int:
10+
def dfs(begin: int, n: int) -> int:
11+
if begin == len(nums):
12+
return 0
13+
14+
cnt = 0
15+
16+
for i in range(begin, len(nums)):
17+
if nums[i] <= n:
18+
continue
19+
20+
cnt = max(1 + dfs(i + 1, nums[i]), cnt)
21+
22+
return cnt
23+
24+
return dfs(0, float("-inf"))
25+
26+
# dp
27+
def lengthOfLIS(self, nums: list[int]) -> int:
28+
dp = [1] * (n := len(nums))
29+
30+
for i in reversed(range(n - 1)):
31+
for j in range(i + 1, n):
32+
if nums[j] > nums[i]:
33+
dp[i] = max(1 + dp[j], dp[i])
34+
35+
return max(dp)
36+
37+
# binary search
38+
def lengthOfLIS(self, nums: list[int]) -> int:
39+
tails = []
40+
41+
for n in nums:
42+
if (index := bisect.bisect_left(tails, n)) == len(tails):
43+
tails.append(n)
44+
else:
45+
tails[index] = n
46+
47+
return len(tails)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# https://leetcode.com/problems/solving-questions-with-brainpower/
2+
3+
4+
class Solution:
5+
# brute force
6+
def mostPoints(self, questions: list[list[int]]) -> int:
7+
def dfs(i: int = 0) -> int:
8+
if i >= len(questions):
9+
return 0
10+
11+
return max(questions[i][0] + dfs(i + 1 + questions[i][1]), dfs(i + 1))
12+
13+
return dfs()
14+
15+
# tabulation
16+
def mostPoints(self, questions: list[list[int]]) -> int:
17+
dp = [0] * (n := len(questions))
18+
19+
for i in reversed(range(n)):
20+
p, bp = questions[i]
21+
dp[i] = max(
22+
p + (dp[i + 1 + bp] if i + 1 + bp < n else 0),
23+
dp[i + 1] if i + 1 < n else 0,
24+
)
25+
26+
return dp[0]

0 commit comments

Comments
 (0)