欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 97 每日一题 Day 11.

程序员文章站 2022-07-12 23:07:22
...

昨天的题好难,没搞懂,后来把题解cpoy上去了,,,哎我好菜,
今天的也不大会,看了几个题解,才明白大概是怎么回事
先上代码吧,虽然也是参考别人题解的

class Solution {
public:
    int maxCoins(vector<int>& nums) {
        int n=nums.size();
        if(n==0)    
            return 0;
        if(n==1)    
            return nums[0];
        //auto dp=vector<vector<int>>(nums.size()+2,vector<int>(nums.size()+2,0));
        vector<vector<int>> dp(n+2,vector<int>(n+2,0));
        int i=0,j=n+1;
        vector<int> boo(nums.size()+2,1);
        for(int i=1;i<=nums.size();i++)
        {
            boo[i]=nums[i-1];
        }
        for(i=2;i<n+2;i++)
            for(j=0;j<n+2-i;j++)
                for(int k=j+1;k<j+i;k++)
                {
                    dp[j][j+i]=max(boo[k]*boo[j]*boo[i+j]+dp[j][k]+dp[k][i+j],dp[j][i+j]);
                }
        return dp[0][n+1];
    }
};

大概思路是:
在序列中,总会有最后一个被扎破的气球,那么这个气球的硬币数就是boo[i],总的硬币是dp[0][i-1]+boo[i]+boo[i+1][n+1]
可以看到,每一段都有一个最后被扎破的气球,则每一段都可以由其他段动态规划得出
dp[j][j+i]=max(boo[k]*boo[j]*boo[i+j]+dp[j][k]+dp[k][i+j],dp[j][i+j])
boo是存气球数字的,j是开始,j+i是结束,k是最后一个气球的索引值

看起来逻辑还好,但是实现的时候老师有我想不到的地方,一开始我想的是可以用类似贪心法,选最大的一个作为最后一个气球,但实现起来好麻烦。。
就这样吧。还要努力啊