Skip to content

Commit c39681e

Browse files
author
Chris Wu
committed
no message
1 parent 4ceb3e1 commit c39681e

5 files changed

+137
-0
lines changed

problems/burst-balloons.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
dp[i][j] := max coins gains from nums[i+1:j]
3+
Assume k is the last balloon that get burst within nums[i:j+1], try different k and get the max dp[i][j].
4+
5+
max coins gains from nums[i+1:j] will be the sum of
6+
1. max coins gains from nums[i:k]: `dp[i][k-1] if k-1>=0 else 0`
7+
2. coins gains from bursring k: `(nums[i-1] if 0<=i-1 else 1) * nums[k] * (nums[j+1] if j+1<N else 1)`
8+
3. max coins gains from nums[k+1:j+1]: `dp[k+1][j] if k+1<N else 0`
9+
"""
10+
class Solution(object):
11+
def maxCoins(self, nums):
12+
N = len(nums)
13+
14+
dp = [[0 for _ in xrange(N)] for _ in xrange(N)]
15+
for i in xrange(N): dp[i][i] = (nums[i-1] if 0<=i-1 else 1) * nums[i] * (nums[i+1] if i+1<N else 1)
16+
17+
for l in xrange(2, N+1):
18+
for i in xrange(N):
19+
j = i+l-1
20+
if j>=N: continue
21+
for k in xrange(i, j+1):
22+
dp[i][j] = max(dp[i][j],
23+
(dp[i][k-1] if k-1>=0 else 0) +
24+
(nums[i-1] if 0<=i-1 else 1) * nums[k] * (nums[j+1] if j+1<N else 1) +
25+
(dp[k+1][j] if k+1<N else 0)
26+
)
27+
28+
return dp[0][N-1]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
"""
2+
dp[i][j] := min money guarantee to win within i~j
3+
k is the first guess, try all k and update dp[i][j].
4+
"""
5+
class Solution(object):
6+
def getMoneyAmount(self, N):
7+
dp = [[float('inf') for _ in xrange(N)] for _ in xrange(N)]
8+
for i in xrange(N): dp[i][i] = 0
9+
10+
11+
for l in xrange(2, N+1):
12+
for i in xrange(N):
13+
j = i+l-1
14+
if j>=N: continue
15+
for k in xrange(i, j+1):
16+
dp[i][j] = min(dp[i][j], max(dp[i][k-1] if k-1>=0 else 0, dp[k+1][j] if k+1<N else 0) + (k+1))
17+
18+
return dp[0][N-1]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""
2+
dp[i][j] := longest palindromic subsequence of s[i:j+1]
3+
"""
4+
class Solution(object):
5+
def longestPalindromeSubseq(self, s):
6+
N = len(s)
7+
8+
dp = [[0 for _ in xrange(N)] for _ in xrange(N)]
9+
for i in xrange(N): dp[i][i] = 1
10+
11+
for l in xrange(2, N+1):
12+
for i in xrange(N):
13+
j = i+l-1
14+
if j>=N: continue
15+
dp[i][j] = dp[i+1][j-1]+2 if s[i]==s[j] else max(dp[i+1][j], dp[i][j-1])
16+
17+
return dp[0][N-1]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
dp[i][k] := minimum difficulty of a k days job schedule, D[:i].
3+
maxInRange[i][j] := max(D[i:j+1])
4+
"""
5+
6+
class Solution(object):
7+
def minDifficulty(self, D, K):
8+
if not D or not K or K>len(D): return -1
9+
N = len(D)
10+
11+
maxInRange = [[0 for _ in xrange(N)] for _ in xrange(N)]
12+
for i in xrange(N): maxInRange[i][i] = D[i]
13+
for l in xrange(2, N+1):
14+
for i in xrange(N):
15+
j = i+l-1
16+
if j>=N: continue
17+
maxInRange[i][j] = max(maxInRange[i+1][j-1], D[i], D[j])
18+
19+
dp = [[float('inf') for _ in xrange(K+1)] for _ in xrange(N+1)]
20+
dp[0][0] = 0
21+
22+
for i in xrange(1, N+1):
23+
for k in xrange(1, min(i, K)+1):
24+
for j in xrange(k, i+1):
25+
dp[i][k] = min(dp[i][k], dp[j-1][k-1]+maxInRange[j-1][i-1])
26+
27+
#if you don't pre-calculate maxInRange
28+
#dp[i][k] = min(dp[i][k], dp[j-1][k-1]+max(D[j-1:i]))
29+
return dp[N][K]

problems/split-array-largest-sum.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"""
2+
TLE
3+
dp[i][k] := min of the largest sum among k subarrays from nums[:i]
4+
"""
5+
class Solution(object):
6+
def splitArray(self, nums, K):
7+
N = len(nums)
8+
9+
dp = [[float('inf') for _ in xrange(K+1)] for _ in xrange(N+1)]
10+
dp[0][0] = 0
11+
12+
for i in xrange(1, N+1):
13+
for k in xrange(1, min(i, K)+1):
14+
for j in xrange(k, i+1):
15+
dp[i][k] = min(dp[i][k], max(dp[j-1][k-1], sum(nums[j-1:i])))
16+
17+
return dp[N][K]
18+
19+
20+
"""
21+
TLE
22+
dp[i][k] := min of the largest sum among k subarrays from nums[:i]
23+
s[i][j] := sum of nums[i:j+1]
24+
"""
25+
class Solution(object):
26+
def splitArray(self, nums, K):
27+
N = len(nums)
28+
29+
s = [[0 for _ in xrange(N)] for _ in xrange(N)]
30+
for i in xrange(N): s[i][i] = nums[i]
31+
for l in xrange(2, N):
32+
for i in xrange(N):
33+
j = i+l-1
34+
if j>=N: continue
35+
s[i][j] = s[i+1][j-1]+nums[i]+nums[j]
36+
37+
dp = [[float('inf') for _ in xrange(K+1)] for _ in xrange(N+1)]
38+
dp[0][0] = 0
39+
40+
for i in xrange(1, N+1):
41+
for k in xrange(1, min(i, K)+1):
42+
for j in xrange(k, i+1):
43+
dp[i][k] = min(dp[i][k], max(dp[j-1][k-1], s[j-1][i-1]))
44+
45+
return dp[N][K]

0 commit comments

Comments
 (0)