• 刷题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.
    

    三、优化措施

    无,还要继续努力!

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    wait/sleep/yield的区别
    54点提高PHP编程效率(转)
    ftp 使用
    转义 html 里特殊含义字符
    查看端口是否被占用
    webservice 获取调用者IP
    字符编码
    你有读过软件的协议或是网站的服务条款吗?
    使用TSQL的Rand函数生成随机数的艰苦历程
    几个.NET方面的问题——参考答案
  • 原文地址:https://www.cnblogs.com/siweihz/p/12340449.html
Copyright © 2020-2023  润新知