zoukankan      html  css  js  c++  java
  • 刷题312. Burst Balloons

    一、题目说明

    题目312. Burst Balloons,有n个气球编号0 ~ n-1,每个气球上有一个数字,存在数组nums中。每当戳破一个气球i的时候,可以获得nums[left] * nums[i] * nums[right]个硬币。求能获得的最大硬币数。难度是Hard!

    二、我的解答

    这个题目,没解答出来。

    先假设第一个被戳爆的气球为x,则x两边的气球则产生了依赖;那我们假设不戳爆x,则x两边的气球就没有了依赖关系!这个气球x,我们可以放在最后戳爆它。

    用dp解决,状态转移方程:dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+nums[i]*nums[k]*nums[j]),其中k表示区间[i,j]中最后戳破的一个气球。dp[i][j]表示第i至第j个元素这个区间能获得的最大硬币数。

    class Solution {
    public:
        int maxCoins(vector<int>& nums) {
        	//nums[-1]=nums[n]=1 
            nums.insert(nums.begin(),1);
            nums.push_back(1);
            
            int n=nums.size();
            
            int dp[n][n];   //dp[i][j]表示戳破第i至第j个元素这个区间能获得的最大硬币数
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    dp[i][j]=0;
                    
            for(int r=2;r<n;r++)            //r为区间长度
                for(int i=0;i<n-r;i++){    //i为左区间
                    int j=i+r;            //j为右区间
                    for(int k=i+1;k<j;k++)
                        dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+nums[i]*nums[k]*nums[j]);
                }
            
            return dp[0][n-1];
        }
    };
    

    性能如下:

    Runtime: 12 ms, faster than 99.41% of C++ online submissions for Burst Balloons.
    Memory Usage: 8.8 MB, less than 90.00% of C++ online submissions for Burst Balloons.
    

    三、优化措施

    无,还要继续努力!

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    java远程调用rmi入门实例
    POJ2752 Seek the Name, Seek the Fame 【KMP】
    Scala入门到精通——第十六节 泛型与注解
    js:简单的拖动效果
    Android拍照、摄像方向旋转的问题 代码具体解释
    对dispatch_async到主线程的逻辑封装成C/C++接口类型
    Oracle password expire notices
    CentOS bridge br0 kvm libvirt-xml
    国内常用ntp服务器ip地址
    C Deepin指针
  • 原文地址:https://www.cnblogs.com/siweihz/p/12340449.html
Copyright © 2011-2022 走看看