一、題目說明
題目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.
三、優化措施
無,還要繼續努力!