leetcode 312. 戳气球

dp[i][j]表示从i到j序列,能获得的最大值。

一开始总想着枚举区间中最先选的那个数,后面发现这样做的话,没法继续了。

换一个思路:枚举最后一个选的,一切就豁然开朗了。

class Solution {
public:
    int maxCoins(vector<int>& nums) {
        int n=nums.size();
        int dp[n+3][n+3];
        memset(dp,0,sizeof(dp));
        int a[n+2];
        a[0]=1;
        for(int i=1;i<=n;i++)
        {
            a[i]=nums[i-1];
        }
        a[n+1]=1;
        for(int i=n;i>=1;i--)
        {
            for(int j=i;j<=n;j++)
            {
                if(i==j)
                {
                    dp[i][j]=a[i]*a[i-1]*a[i+1];
                    continue;
                }
                for(int k=i;k<=j;k++)
                {
                    dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]*a[i-1]*a[j+1]);
                }
            }
        }
        return dp[1][n];
    }
};
发布了417 篇原创文章 · 获赞 172 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/104162793