博客
关于我
LintCode168.吹气球
阅读量:210 次
发布时间:2019-03-01

本文共 1381 字,大约阅读时间需要 4 分钟。

有n个气球,编号为0到n-1,每个气球都有一个分数,存在nums数组中。每次吹气球i可以得到的分数为 nums[left] * nums[i] * nums[right],left和right分别表示i气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。

**区间型动态规划问题+记忆化搜索

从大到小 类似分治的思想
dp数组代表吹爆序号i到j的气球得到的最多分数
为了方便边界两个气球的运算 在左右边界添加一个元素1
用一个二维数组记录已经搜索过的区间情况
对数组每个元素作为最后吹爆的气球进行遍历
搜索每个元素左右两边区间 dfs
**

public class Solution {       /**     * @param nums: A list of integer     * @return: An integer, maximum coins     */    public int maxCoins(int[] nums) {           int n = nums.length;        if(nums == null || n == 0)            return 0;        int[] arr = new int[n+2];        int[][] dp = new int[n+2][n+2];        boolean[][] flag = new boolean[n+2][n+2];        for(int i = 1; i < n + 1; i++){               arr[i] = nums[i-1];        }        arr[0] = 1;        arr[n + 1] = 1;        return search(1, n, arr, dp, flag);    }    private int search(int left, int right, int[] arr, int[][] dp, boolean[][] flag){           if(flag[left][right])            return dp[left][right];        for(int k = left; k <= right; k++){               int midValue = arr[left-1] * arr[k] * arr[right+1];            int leftValue = search(left, k-1, arr, dp, flag);            int rightValue = search(k+1, right, arr, dp, flag);            dp[left][right] = Math.max(dp[left][right], midValue + leftValue + rightValue);        }        flag[left][right] = true;        return dp[left][right];    }}

转载地址:http://exvv.baihongyu.com/

你可能感兴趣的文章
Python进程间共享内存(版本3.8+)
查看>>
行为树 --- [1] BehaviorTree.CPP的编译及使用
查看>>
专业mac数据恢复软件Tenorshare UltData Mac
查看>>
alienskineyecandy mac
查看>>
Java Maven基础
查看>>
Vasp INCAR参数详解
查看>>
Django 框架技术概况
查看>>
Django 开发学生管理系统
查看>>
有趣的三个水桶等分8升水问题
查看>>
2020年高考物理两道解答题
查看>>
Vasp Fe晶体自动结构优化
查看>>
Leetcode 811. 子域名访问计数
查看>>
Leetcode 97. 交错字符串
查看>>
腾讯2017校招开发工程师笔试试题第二套解析
查看>>
2016年腾讯校招笔试题 详解
查看>>
01 类加载机制解析一
查看>>
02 类加载机制解析二:双亲委派机制
查看>>
jquery select 通过text查找
查看>>
docker 部署springboot+redis
查看>>
mybatis in 查询备忘
查看>>