Skip to content

Commit e809d16

Browse files
committed
leetcode.com 312. Burst Balloons
문제 링크: https://leetcode.com/problems/burst-balloons/description/
1 parent dc6562b commit e809d16

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from typing import List
2+
import sys
3+
4+
5+
# N ** 3으로 작성된 코드
6+
# def maxCoins(self, nums: List[int]) -> int:
7+
# n = len(nums)
8+
# nums = [1] + nums + [1]
9+
# dp = [[0] * (n + 2) for _ in range(n + 2)]
10+
#
11+
# for i in range(n, 0, -1):
12+
# for j in range(i, n + 1):
13+
# for k in range(i, j + 1):
14+
# dp[i][j] = max(dp[i][j], dp[i][k - 1] + dp[k + 1][j] + nums[k] * nums[i - 1] * nums[j + 1])
15+
#
16+
# return dp[1][n]
17+
18+
class Solution:
19+
def maxCoins(self, nums: List[int]) -> int:
20+
nums = [1] + nums + [1]
21+
l = len(nums)
22+
dp = [[-1] * l for _ in range(l)]
23+
24+
def dp_d_c(i_left, i_right):
25+
if i_right - i_left < 0:
26+
return 0
27+
28+
if dp[i_left][i_right] > -1:
29+
return dp[i_left][i_right]
30+
31+
coins_mx = 0
32+
33+
for i in range(i_left, i_right + 1):
34+
coins_i = nums[i_left - 1] * nums[i] * nums[i_right + 1]
35+
coins_lr = 0
36+
coins_lr += dp_d_c(i_left, i - 1)
37+
coins_lr += dp_d_c(i + 1, i_right)
38+
39+
coins_mx = max(coins_mx, coins_i + coins_lr)
40+
41+
dp[i_left][i_right] = coins_mx
42+
43+
return dp[i_left][i_right]
44+
45+
coins = dp_d_c(1, l - 2)
46+
return coins
47+
48+
# DP (Naive)
49+
# def maxCoins(self, nums: List[int]) -> int:
50+
# memo: dict = {}
51+
# nums = [1] + nums + [1]
52+
# coins = self.dp(nums, memo)
53+
#
54+
# return coins
55+
#
56+
# def dp(self, nums: List[int], memo: dict):
57+
# if tuple(nums) in memo.keys():
58+
# return memo[tuple(nums)]
59+
#
60+
# if len(nums) == 3:
61+
# memo[tuple(nums)] = nums[0] * nums[1] * nums[2]
62+
# return memo[tuple(nums)]
63+
#
64+
# coins = 0
65+
# mx = -sys.maxsize - 1
66+
#
67+
# for i in range(1, len(nums) - 1):
68+
# coins = nums[i - 1] * nums[i] * nums[i + 1]
69+
# coins_2 = self.dp(nums[:i] + nums[i + 1:], memo)
70+
#
71+
# mx = max(mx, coins + coins_2)
72+
#
73+
# memo[tuple(nums)] = mx
74+
#
75+
# return mx
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from unittest import TestCase
2+
from main import Solution
3+
4+
5+
class TestSolution(TestCase):
6+
def test1_max_coins(self):
7+
sol = Solution()
8+
self.assertEqual(167, sol.maxCoins(nums=[3, 1, 5, 8]))
9+
10+
def test2_max_coins(self):
11+
sol = Solution()
12+
self.assertEqual(10, sol.maxCoins(nums=[1, 5]))

0 commit comments

Comments
 (0)