刷題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.

三、優化措施

無,還要繼續努力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章