力扣 312. 戳氣球 區間dp

https://leetcode-cn.com/problems/burst-balloons/
在這裏插入圖片描述

思路:設dp[i][j]dp[i][j]表示戳破區間[i,j][i,j]的所有氣球所能獲得的最大硬幣數。爲了方便處理,我們在數組開頭和結尾各放入一個11,設數組原來有nn個元素,顯然答案爲dp[1][n]dp[1][n]。那麼對於區間[i,j][i,j],我們需要枚舉所有的劃分方案,設中斷點爲kk,則有:dpi,j=max(dpi,k1+dpk+1,j+ai1akaj+1)dp_{i,j}=max(dp_{i,k-1}+dp_{k+1,j}+a_{i-1}*a_{k}*a_{j+1})kk的取值範圍爲[i,j][i,j]。所以複雜度爲O(n3)O(n^3)

class Solution {
public:
    int dp[505][505];
    int maxCoins(vector<int>& nums) {
        int n=nums.size();
        nums.insert(nums.begin(),1);
        nums.push_back(1);
        for(int i=1;i<=n;i++)
            dp[i][i]=nums[i-1]*nums[i]*nums[i+1];
        for(int len=2;len<=n;len++)
        {
            for(int i=1;i+len-1<=n;i++)
            {
                int j=i+len-1;
                for(int k=i;k<=j;k++)
                    dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j]+nums[i-1]*nums[k]*nums[j+1]);
            }
       }
        return dp[1][n];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章