LC 刷题日记

Leetcode 312 戳气球

其实到现在也没太搞明白一些循环上的事情, 可能需要之前看起吧. 这道题最经典的就是用区间dp来做. 最核心的部分是状态转移方程:
其中, k 表示的是在i到j的子数组中,最后一个戳破的气球的下标. 因为它是最后戳破的,所以它最后的两个邻居就是i和j, 那么接下来我们仅需要枚举从i到j中,哪个地方戳破的气球会有最大值,并将其保存作为dp[i][j]的值.
代码如下:

    public int maxCoins(int[] nums) {
        if(nums==null) return 0;
        int n=nums.length;
        int[] coins=new int[n+2];
        coins[0]=1;
        coins[coins.length-1]=1;
        for(int l=1;l<=n;l++)
        {
            coins[l]=nums[l-1];
        }
        n=coins.length;
        int[][] dp=new int[n][n];
        for(int i=n;i>-1;i--)  // 注意,因为问题的求解顺序,所以从后向前枚举起点i.
        {
            for(int j=i+2;jmax) max=tmp;
                }
                dp[i][j]=max;
            }
        }
        return dp[0][n-1];
    }

后续会进一步完善....

你可能感兴趣的:(LC 刷题日记)