leetcode312 戳气球

题目: https://leetcode-cn.com/problems/burst-balloons/

思路:动态规划

状态:dp[i][j] 表示戳破[i,j]范围内这些气球所能获得的最大数量的硬币

转移方程: dp[i][j] = max(dp[i][j],dp[i][k-1] + dp[k+1][j] + arr[i-1]*arr[k]*arr[j+1]); (i<=k<=j) 

方程含义: 选择i到j之间的某一个气球k,然后先戳破 i到k-1之间的气球,再戳破k+1到 j 之间的气球,最后戳破k这个气球。

(先戳破[k+1,j]之间的气球,再戳破[i,k-1]之间的气球,最后戳破k。 跟上面情况的计算结果也一样。)

                 我们将 k 从i遍历到j,于是覆盖了所有的情况。

因为题目说arr[0] 和 arr[n+1] 都设置为1,所以假如题目给定的气球数目是n,那我们的结果就是dp[1][n];

class Solution {
        int max(int a,int b)
        {
            return a>b?a:b;
        }
        public int maxCoins(int[] nums) {
            int n = nums.length;
            int arr[] = new int[n+2];
            arr[0] = arr[n+1] = 1;
            for(int i=0;i<n;i++)
            {
                arr[i+1] = nums[i]; 
            }
            int dp[][] = new int [n+2][n+2];
            for(int span=1;span<=n;span++)//间隔 ,从1~n,因为要从小范围推出大范围。
            {
                for(int i=1;i<=n-span+1;i++)//选择起点i
                {
                    int j = i + span - 1;//选择终点j
                    for(int k=i;k<=j ; k++)//选择戳破i到j的某个气球k
                    {
                        dp[i][j] = max(dp[i][j],dp[i][k-1] + dp[k+1][j] + arr[i-1]*arr[k]*arr[j+1]);
                    }
                }
            }
            return dp[1][n];
        }
    }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值