zoukankan      html  css  js  c++  java
  • 力扣312题(戳气球问题)

    312、戳气球问题

    基本思想:

    动态规划

    具体实现:

    1、确认状态

    最后一步---dp[i][j]=x,戳破气球i和气球j之间的所有气球(不包括i和j),可以获得的最高分数为x。

                       设两个虚拟气球,气球0和气球n+1

    子问题---最后一个被戳破的气球为k,子问题就是dp[i][k],dp[k][j]

     2、状态转移方程

    dp[i][j]=dp[i][k]+dp[k][j]+points[i]*points[k]*points[j]

    3、初始状态

    数组都初始化为0

    4、计算顺序

    从左到右,从下到上

    因为最后的答案是dp[0][n+1]

    代码:

    class Solution:
        def maxCoins(self, nums: List[int]) -> int:
            n = len(nums)
            points = [0]*(n+2)
            points[0] = points[n+1] = 1 # 虚拟气球
            for i in range(1,n+1):
                points[i] = nums[i-1]
            dp = [[0]*(n+2) for _ in range(n+2)]
            for i in range(n,-1,-1):
                for j in range(i+1,n+2):
                    for k in range(i+1,j):
                        dp[i][j] = max(dp[i][j],dp[i][k]+dp[k][j]+points[i]*points[j]*points[k])
            return dp[0][n+1]
  • 相关阅读:
    Razor 常用又容易忘记语法
    游览器 reflow
    正则表达式
    migration to end point routing
    js 翻译 c# 注意事项
    Angular 学习笔记 work with excel (导出 excel)
    html4,5 basic
    IIS 服务器配置
    meta 的用途
    正则表达 常用
  • 原文地址:https://www.cnblogs.com/zhaojiayu/p/14560010.html
Copyright © 2011-2022 走看看