【LeetCode】Day164-戳气球

题目

312. 戳气球【困难】

题解

假设(i,j)开区间内最后一个被戳破的气球是k,

  1. 状态定义:dp[i][j] 表示在开区间(i,j)内能拿到的最多金币

  2. 状态转移方程
    如果戳破气球k,则获得的金币数量total=dp[i][k]+dp[k][j]+val[i]*val[k]*val[j]
    那么 dp[i][j]=max(total) i<k<j,i<j-1

  3. 初始条件
    i>=j-1时,dp[i][j]=0

  4. 返回值:dp[0][n+1]

注意:i,j的取值

class Solution {
    public int maxCoins(int[] nums) {
        int n=nums.length;
        int[][] dp=new int[n+2][n+2];
        //val[i]=nums[i-1]
        int[] val=new int[n+2];
        val[0]=val[n+1]=1;
        for(int i=1;i<n+1;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+=dp[i][k]+dp[k][j];
                    dp[i][j]=Math.max(dp[i][j],sum);
                }
            }
        }
        return dp[0][n+1];
    }
}

时间复杂度: O ( n 3 ) O(n^3) O(n3)

空间复杂度: O ( n 2 ) O(n^2) O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值