题目描述
给定一个数组arr,长度为n。代表排有分数的气球。 每打爆一个气球都能获得分数,假设打爆气球的分数为X,获得分数的规则如下:
1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为L:如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为R.获得分数为LXR
2)如果被打爆的气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为L:如果被打爆气球的右边所有气球都已经被打爆,获得分数为LX。
3)如果被打爆气球的左边所有的气球都已经被打爆:如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球。获得分数为X
R.
4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为X。
目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。
输入描述:

输出包括两行,第一行包括一个整数n(0<=n<=500),第二行包括n个整数,代表数组arr (1<=arr[i]<=100)。

输出描述:

输出包括一个整数,代表可能获得的最大分数。

示例1

输入3
3 2 5输出50

解法一:暴力递归

import java.io.*;
import java.util.*;
public class Main{public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int len = Integer.parseInt(br.readLine());String[] ss = br.readLine().trim().split(" ");int[] arr = new int[len];for(int i=0;i<arr.length;i++){arr[i] = Integer.parseInt(ss[i]);}int res = findMax(arr);System.out.println(res);}public static int findMax(int[] arr){if(arr==null||arr.length==0) return 0;if(arr.length==1) return arr[0];int[] help = new int[arr.length+2];help[0] = 1;help[help.length-1] = 1;for(int i=1;i<help.length-1;i++){help[i] = arr[i-1];}return process(help,1,help.length-2);}public static int process(int[] arr,int l,int r){if(l==r) return arr[l]*arr[l-1]*arr[r+1];int max = 0;max = Math.max(process(arr,l+1,r)+arr[l]*arr[l-1]*arr[r+1],process(arr,l,r-1)+arr[r]*arr[r+1]*arr[l-1]);for(int i=l+1;i<r;i++){max = Math.max(max,process(arr,l,i-1)+process(arr,i+1,r)+arr[i]*arr[l-1]*arr[r-1]);}return max;}
}

解法二:动态规划

问题:数组越界非法访问?
麻辣皮:注意加上

        if (len == 0) {System.out.println(0);return;}
import java.io.*;
import java.util.*;
public class Main{public static void main(String[] args) throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int len = Integer.parseInt(br.readLine());//加在这里if (len == 0) {System.out.println(0);return;}String[] ss = br.readLine().trim().split(" ");int[] arr = new int[len];for(int i=0;i<arr.length;i++){arr[i] = Integer.parseInt(ss[i]);}int res = findMax1(arr);System.out.println(res);}public static int findMax(int[] arr){if(arr==null||arr.length==0) return 0;if(arr.length==1) return arr[0];int N = arr.length;int[] help = new int[N+2];help[0] = 1;help[N+1] = 1;for(int i=0;i<N;i++){help[i+1] = arr[i];}int[][] dp = new int[N+2][N+2];for(int i=1;i<=N;i++){dp[i][i] = help[i-1]*help[i]*help[i+1];}for(int l = N;l>=1;l--){for(int r=l+1;r<=N;r++){int finaL = help[l-1]*help[l]*help[r+1]+dp[l+1][r];int finaR = help[l-1]*help[r]*help[r+1]+dp[l][r-1];dp[l][r] = Math.max(finaL,finaR);for(int i=l;i<r;i++){dp[l][r] = Math.max(dp[l][r],help[l-1]*help[i]*help[r+1]+dp[l][i-1]+dp[i+1][r]);}}}return dp[1][N];}public static int findMax1(int[] arr){if(arr==null||arr.length==0) return 0;if(arr.length==1) return arr[0];int[] help = new int[arr.length+2];help[0] = 1;help[help.length-1] = 1;for(int i=1;i<help.length-1;i++){help[i] = arr[i-1];}int[][] dp = new int[help.length][help.length];//处理对角线for(int i=1;i<help.length-1;i++){dp[i][i] = help[i]*help[i-1]*help[i+1];            }for(int l=help.length-2;l>=1;l--){for(int r=l+1;r<=help.length-2;r++){int max = Math.max(dp[l+1][r]+help[l]*help[l-1]*help[r+1],dp[l][r-1]+help[r]*help[r+1]*help[l-1]);for(int i=l+1;i<r;i++){max = Math.max(max,dp[l][i-1]+dp[i+1][r]+help[i]*help[l-1]*help[r+1]);}dp[l][r] = max;}}return dp[1][arr.length];}
}

解法三:动态规划二

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{public static int maxCores2(int[] cores) {int len = cores.length;int[][] dp = new int[len][len];for (int i = 0; i < len; i++)for (int j = i - 2; j >= 0; j--)for (int k = j + 1; k < i; k++)dp[i][j] = Math.max(dp[i][j],dp[k][j] + dp[i][k] + cores[i] * cores[j] * cores[k]);return dp[len - 1][0];}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] strs = br.readLine().split(" ");int n = Integer.parseInt(strs[0]);if (n == 0) {System.out.println(0);return;}strs = br.readLine().split(" ");int[] cores = new int[n + 2];cores[0] = cores[n + 1] = 1;for (int i = 1; i < cores.length - 1; i++)cores[i] = Integer.parseInt(strs[i - 1]);System.out.println(maxCores2(cores));}
}

程序员代码面试指南刷题--第四章.打气球的最大分数相关推荐

  1. 程序员代码面试指南刷题--第五章.字符串的调整II

    题目描述 给定一个字符类型的数组chas[],chas右半区全是空字符,左半区不含有空字符.现在想将左半区的空格字符串替换成"%20",假设chas右半区足够大,可以满足替换需要的 ...

  2. 程序员代码面试指南刷题--第五章.翻转字符串(1)

    题目描述 给定字符类型的数组chas,请在单词间做逆序调整.只要做到单词的顺序逆序即可,对空格的位置没有要求. 输入描述: 输入一行只含字母和空格的字符串,代表chas. 输出描述: 输出一行字符串, ...

  3. 程序员代码面试指南刷题--第五章.字符串的调整I

    题目描述 给定一个字符串chas[],其中只含有字母字符和""字符,现在想把所有""全部挪到chas的左边,字母字符移到chas的右边.完成调整函数. 输入描述 ...

  4. 程序员代码面试指南刷题--第五章.数组中两个字符串的最小距离

    题目描述 给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1. 输入描述: 输入 ...

  5. 《程序员代码面试指南第二版》Python实现(个人读书笔记)

    说明 最近在读左神的书---<程序员代码面试指南-IT名企算法与数据结构题目最优解(第二版)>以及看了一些左神的基础.进阶.高频等视频课程,为了记录自己的学习成果,并且方便以后查看,将自己 ...

  6. 程序员代码面试指南第二版 4.猫狗队列

    welcome to my blog 程序员代码面试指南第二版 4.猫狗队列 题目描述 题目描述 实现一种猫狗队列的结构,要求如下: 1. 用户可以调用 add 方法将 cat 或者 dog 放入队列 ...

  7. 算法大神左程云耗尽5年心血分享程序员代码面试指南第2版文档

    前言 学习是一种基础性的能力.然而,"吾生也有涯,而知也无涯.",如果学习不注意方法,则会"以有涯随无涯,殆矣". 学习就像吃饭睡觉一样,是人的一种本能,人人都 ...

  8. 《程序员代码面试指南》第五章 字符串问题 拼接所有字符串产生字典顺序最小的大写字符串...

    题目 拼接所有字符串产生字典顺序最小的大写字符串 java代码 努力中.... 转载于:https://www.cnblogs.com/lizhouwei/p/8955158.html

  9. 《程序员代码面试指南》第二章 链表问题 构造链表和节点的实体

    准备一些链表和节点的实体,方便后面使用 java代码 /*** @Description:构造一个链表实体,方便后续构造链表* @Author: lizhouwei* @CreateDate: 201 ...

  10. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...

最新文章

  1. asp.net % = #区别
  2. OpenCV2和3的下载、安装和配置
  3. windows10安装python环境_在windows10下安装python(配置环境变量),Windows10
  4. Michael-Scott非阻塞队列(lock-free)算法的C实现
  5. 【Qt】modbus之串口模式写操作
  6. C语言一元二次方程表示如下,C语言一元二次方程day6
  7. 移动端Web开发如何处理横竖屏
  8. 系统安全:Nessus Home版安装使用
  9. 递推+矩阵快速幂 HDU 2065
  10. 四叶草默认启动设置方法
  11. QQ空间自动点赞代码
  12. Asio驱动开发学习笔记(3)
  13. Firefox浏览器修改背景颜色为豆沙绿
  14. 打不开计算机 在任务栏里显示,电脑打开的窗口在任务栏不显示怎么办?
  15. PART 3.3 风控建模卡方分箱计算篇
  16. 裁判文书网2019年9月份最新爬虫
  17. 【摩斯电码】我是如何通过一张小纸条渗透进了妹子的心
  18. Python从入门到PY交易,基础语法,散记(一)
  19. java实现猴子排序_Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序...
  20. 九爷带你玩转 php单元测试

热门文章

  1. 520情人节告白❤HTML+CSS+JavaScript实现抖音流动爱心
  2. [转]漫谈个人知识管理-PKM的方法
  3. 国家电网车辆智能车载终端4G全网通T-BOX 、车联网OBD终端、4G TBOX终端
  4. 非常的好的协同过滤入门文章
  5. iPhone蓝牙技术学习
  6. OSG开发笔记(二十五):OSG漫游之CS移动、碰撞检测与跳跃
  7. Python爬虫 requests使用post请求分析并登录Chinaunix
  8. H-Index H指数
  9. PMOS类型 LDO基本原理
  10. pip install deepforest 失败