列表

详情


312. 戳气球

n 个气球,编号为0n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。

 

示例 1:
输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins =  3*1*5    +   3*5*8   +  1*3*8  + 1*8*1 = 167

示例 2:

输入:nums = [1,5]
输出:10

 

提示:

相似题目

合并石头的最低成本

原站题解

去查看

class Solution {
public:
int maxCoins(vector<int>& nums) {
}
};
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

java 解法, 执行用时: 35 ms, 内存消耗: 41.5 MB, 提交时间: 2024-06-09 10:29:46

class Solution {
public int maxCoins(int[] nums) {
int n = nums.length;
int[][] rec = new int[n + 2][n + 2];
int[] val = new int[n + 2];
val[0] = val[n + 1] = 1;
for (int i = 1; i <= n; i++) {
val[i] = nums[i - 1];
}
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 2; j <= n + 1; j++) {
for (int k = i + 1; k < j; k++) {
int sum = val[i] * val[k] * val[j];
sum += rec[i][k] + rec[k][j];
rec[i][j] = Math.max(rec[i][j], sum);
}
}
}
return rec[0][n + 1];
}
}

java 解法, 执行用时: 110 ms, 内存消耗: 41.6 MB, 提交时间: 2024-06-09 10:29:21

class Solution {
public int[][] rec;
public int[] val;
public int maxCoins(int[] nums) {
int n = nums.length;
val = new int[n + 2];
for (int i = 1; i <= n; i++) {
val[i] = nums[i - 1];
}
val[0] = val[n + 1] = 1;
rec = new int[n + 2][n + 2];
for (int i = 0; i <= n + 1; i++) {
Arrays.fill(rec[i], -1);
}
return solve(0, n + 1);
}
public int solve(int left, int right) {
if (left >= right - 1) {
return 0;
}
if (rec[left][right] != -1) {
return rec[left][right];
}
for (int i = left + 1; i < right; i++) {
int sum = val[left] * val[i] * val[right];
sum += solve(left, i) + solve(i, right);
rec[left][right] = Math.max(rec[left][right], sum);
}
return rec[left][right];
}
}

golang 解法, 执行用时: 36 ms, 内存消耗: 5.4 MB, 提交时间: 2023-05-24 17:36:11

func maxCoins(nums []int) int {
n := len(nums)
rec := make([][]int, n + 2) // rec[i][j] (i, j)
for i := 0; i < n + 2; i++ {
rec[i] = make([]int, n + 2)
}
val := make([]int, n + 2)
val[0], val[n+1] = 1, 1
for i := 1; i <= n; i++ {
val[i] = nums[i-1]
}
for i := n - 1; i >= 0; i-- {
for j := i + 2; j <= n + 1; j++ {
for k := i + 1; k < j; k++ {
sum := val[i] * val[k] * val[j]
sum += rec[i][k] + rec[k][j]
rec[i][j] = max(rec[i][j], sum)
}
}
}
return rec[0][n+1]
}
func max(x, y int) int {
if x > y {
return x
}
return y
}

golang 解法, 执行用时: 152 ms, 内存消耗: 5.5 MB, 提交时间: 2023-05-24 17:35:19

func maxCoins(nums []int) int {
n := len(nums)
val := make([]int, n + 2)
for i := 1; i <= n; i++ {
val[i] = nums[i - 1]
}
val[0], val[n+1] = 1, 1
rec := make([][]int, n + 2)
for i := 0; i < len(rec); i++ {
rec[i] = make([]int, n + 2)
for j := 0; j < len(rec[i]); j++ {
rec[i][j] = -1
}
}
return solve(0, n + 1, val, rec)
}
func solve(left, right int, val []int, rec [][]int) int {
if left >= right - 1 {
return 0
}
if rec[left][right] != -1 {
return rec[left][right]
}
for i := left + 1; i < right; i++ {
sum := val[left] * val[i] * val[right]
sum += solve(left, i, val, rec) + solve(i, right, val, rec)
rec[left][right] = max(rec[left][right], sum)
}
return rec[left][right]
}
func max(x, y int) int {
if x > y {
return x
}
return y
}

python3 解法, 执行用时: 5568 ms, 内存消耗: 40 MB, 提交时间: 2023-05-24 17:34:46

class Solution:
def maxCoins(self, nums: List[int]) -> int:
n = len(nums)
val = [1] + nums + [1]
@lru_cache(None)
def solve(left: int, right: int) -> int:
if left >= right - 1:
return 0
best = 0
for i in range(left + 1, right):
total = val[left] * val[i] * val[right]
total += solve(left, i) + solve(i, right)
best = max(best, total)
return best
return solve(0, n + 1)

python3 解法, 执行用时: 2756 ms, 内存消耗: 18.1 MB, 提交时间: 2023-05-24 17:34:15

class Solution:
def maxCoins(self, nums: List[int]) -> int:
#nums1便
nums.insert(0,1)
nums.insert(len(nums),1)
store = [[0]*(len(nums)) for i in range(len(nums))]
def range_best(i,j):
m = 0
#k(i,j)
for k in range(i+1,j): #k(i,j)
#(i,k), (k,j)
left = store[i][k]
right = store[k][j]
a = left + nums[i]*nums[k]*nums[j] + right
if a > m:
m = a
store[i][j] = m
#
for n in range(2,len(nums)): # #3n2
#3len(nums)
#rangelen(nums)-1
#i
for i in range(0,len(nums)-n): #i+n = len(nums)-1
#
range_best(i,i+n)
return store[0][len(nums)-1]

python3 解法, 执行用时: 6524 ms, 内存消耗: 40 MB, 提交时间: 2023-05-24 17:33:07

class Solution:
def maxCoins(self, nums: List[int]) -> int:
n = len(nums)
nums = [1] + nums + [1]
@cache
def solve(L, R):
# nums[L:R+1]
if L > R:
return 0
# L
ret = nums[L-1]*nums[L]*nums[R+1] + solve(L+1, R)
# R
ret = max(ret, nums[L-1]*nums[R]*nums[R+1] + solve(L, R-1))
# k
for k in range(L+1, R):
# nums[L:k] nums[k+1:R+1], nums[k]
cur = solve(L, k-1) + nums[L-1]*nums[k]*nums[R+1] + solve(k+1, R)
ret = max(ret, cur)
return ret
return solve(1, n)

javascript 解法, 执行用时: 196 ms, 内存消耗: 43.9 MB, 提交时间: 2023-05-24 17:32:36

/**
* @param {number[]} nums
* @return {number}
*/
var maxCoins = function (nums) {
let n = nums.length;
//
let points = new Array(n + 2);
points[0] = points[n + 1] = 1;
for (let i = 1; i <= n; i++) {
points[i] = nums[i - 1];
}
// base case 0
let dp = new Array(n + 2).fill(0).map(() => new Array(n + 2).fill(0));
//
// i
for (let i = n; i >= 0; i--) {
// j
for (let j = i + 1; j < n + 2; j++) {
//
for (let k = i + 1; k < j; k++) {
//
dp[i][j] = Math.max(
dp[i][j],
dp[i][k] + dp[k][j] + points[i] * points[j] * points[k]
);
}
}
}
return dp[0][n + 1];
};

cpp 解法, 执行用时: 436 ms, 内存消耗: 10.2 MB, 提交时间: 2023-05-24 17:31:58

/**
i,j
step 1: k (k)
step 2: i, kk, j k, i , j
step 3: k, nums[i]∗nums[k]∗nums[j]
1 len = nums.size() + 20 len-1
*/
class Solution {
public:
int maxCoins(vector<int>& nums) {
// dp(i, j): (i, j)
nums.insert(nums.begin(), 1);
nums.push_back(1);
int len = nums.size();
vector<vector<int>> dp(len, vector<int>(len, 0));
for(int i = len-1; i >=0; --i){ // idp[k][j]ki
for(int j = i+2; j <= len-1; ++j){ // j-i <= 1ji+2
for(int k = i+1; k < j; ++k){ // k
dp[i][j] = max(dp[i][j], dp[i][k] + nums[i] * nums[k] * nums[j] + dp[k][j]);
}
}
}
return dp[0][len-1];
}
};

上一题