Leetcode Burst Balloons

*题目:**Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, the left and right then becomes adjacent.
Find the maximum coins you can collect by bursting the balloons wisely.
题目的理解就是一个数组,数组的-1和size+1的内容假设为1,每次选择数组中的某个元素把和它相邻的两个元素相乘,不断的选择这样的一个元素,把这些相乘的结果加起来,使得总和最大。

思路 : 一开始想的就是,可不可以采用贪心的算法,要使得得到的总和最大,每次选一个选最小的,这样,更早的选掉更小的,那么就可以把更大的数,多乘几次,得到的结果会不会更大呢?但是这个想法,看到题目给的例子的时候,就立马被推翻了。既然这样,可不可以把这个问题进行分解呢?枚举,每次拿掉其中的某一个元素,把剩下分成的两个数组看成两个子问题,可是,这样也不对啊!因为如果你拿掉的那个元素,是一开始数组中间的某个元素,那么划分的两个数组所得的数值大小,就会受到相互影响了。但是,划分成子问题的这个思路肯定是正确的,现在问题的关键就在于怎么划分,怎样才可以使两个子问题不会互相影响呢! 那么我们是不是把划分的规则变成—-选择数组中某个元素为最后拿掉的元素,以此来找一个最大的值,那么剩下的两个部分就互不相干了,这样就好解决了。
首先寻找只有一个元素的数组来找最大值,基于这样的一个基础,不断的寻找长度为n的数组的最大值,不断的往上扩展,由长度为1,2,,n最后寻找到相应的结果。看代码。

    int maxCoins(vector<int>& nums) 
    {
        if(nums.size()==0)
        return 0;
        int* num=new int[nums.size()+2];
        for(int i=1;i<=nums.size();i++)
        num[i]=nums[i-1];
        num[0]=1;
        num[nums.size()+1]=1;
        int dp[501][501]={};
        for(int k=2;k<=nums.size()+1;k++)
        {
            for(int left=0;left+k<nums.size()+2;left++)
            {
                int right=left+k;
                for(int j=left+1;j<right;j++)
                dp[left][right]=max(dp[left][right],dp[left][j]+dp[j][right]+num[j]*num[left]*num[right]);//划分成各种子问题,寻找结果
            }
        }
        return dp[0][nums.size()+1];//返回结果

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值