算法题:打气球的最大分数

最近在看左程云的《程序员代码面试指南》,感觉不错,题都分了类,很方便有目的的刷题,书里的代码都是java实现的,刚好最近在学习python,就用python去练习一下。

1. 问题描述

给定一个数组arr,代表一排有分数的气球。 每打爆一个气球都能获得分数,假设打爆气球的分数为X,获得分数的规则如下:

1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为L:如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为R.获得分数为LXR

2)如果被打爆的气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为L:如果被打爆气球的右边所有气球都已经被打爆,获得分数为LX。

3)如果被打爆气球的左边所有的气球都已经被打爆:如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球。获得分数为XR.

4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为X。

目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数

2.解决方法

1)暴力递归:假设arr[L-1]和arr[R+1]都没爆,要打爆arr[L]到arr[R]的气球,假设arr为[L~R],可以设置一个help数组,添加arr[L-1]和arr[R+1]并将值值设为1。如此便对于相乘便无影响。对于L和R位置,对于普通位置i分别递归地求解。

2)动态规划:以L和R为可变参数作m表,将表画出可以发现,m[i][j]代表i~j上打爆所有气球的最大分数,对于每个位置,其值只依赖于其左侧和正下方的值。则从下往上的完成m表,可以得到结果。

3.代码实现

暴力递归

# 暴力递归

def process(arr, L, R):

if L == R:

return arr[L-1] * arr[L] * arr[R+1]

max_score = max(arr[L-1] * arr[L] * arr[R+1] + process(arr, L+1, R), arr[L-1] * arr[R] * arr[R+1] + process(arr, L, R-1))

for i in range(L+1, R):

max_score = max(max_score, arr[L-1] * arr[i] * arr[R+1] + process(arr, L, i-1) + process(arr, i+1, R))

return max_score

动态规划

# 动态规划

def score(arr):

m = [[0 for i in range(len(arr))] for j in range(len(arr))]

for i in range(1, len(arr)-1):

m[i][i] = arr[i-1] * arr[i] * arr[i+1]

# 求解m[i][j],m[i][j]代表i~j上打爆所有气球的最大分数

L = len(arr) - 2

while L >= 1:

R = L + 1

while R <= len(arr) - 2:

# 最后打爆arr[L]的情况

finalL = arr[L-1] * arr[L] * arr[R+1] + m[L+1][R]

# 最后打爆arr[R]的情况

finalR = arr[R+1] * arr[R] * arr[L-1] + m[L][R-1]

# 先比较一下arr[L]和arr[R]的情况

m[L][R] = max(finalL, finalR)

# 对一般情况进行分析

for i in range(L+1, R):

m[L][R] = max(m[L][R], arr[L-1] * arr[i] * arr[R+1] + m[L][i-1] + m[i+1][R])

R += 1

L -= 1

print("m表:")

for item in m:

for i in item:

print(i, end = '\t')

print()

return m[1][len(arr)-2]

if __name__ == "__main__":

help_arr = [1, 4, 2, 3, 5, 1, 6, 1]

print("(递归)最大分数为:{0}".format(process(help_arr, 1, 6)))

print("(动态规划)最大分数为:{0}".format(score(help_arr)))

结果:

(递归)最大分数为:264

m表:

0 0 0 0 0 0 0 0

0 8 36 104 109 258 264 0

0 0 24 84 104 234 258 0

0 0 0 30 40 156 168 0

0 0 0 0 15 120 138 0

0 0 0 0 0 30 60 0

0 0 0 0 0 0 6 0

0 0 0 0 0 0 0 0

(动态规划)最大分数为:264

用python画气球程序_动态编程气球最大得分(Python实现),规划,打,的,分数,python...相关推荐

  1. python画正方形程序_画正方形-小学生 Python 入门课

    画正方形 还没开始学就要画正方形啊!会不会太难啊? 今天主要是教大家简化版的程序设计流程,其实和大家在日常生活中做的事情是一样的. 第一步:准备画画的工具包(纸和铅笔) 用Python代码就是导入工具 ...

  2. python画棒棒糖程序_论文画图神器!25个常用Matplotlib图的Python代码,收藏收藏!...

    作者:zsx_yiyiyi 编辑:python大本营 大家好,今天要分享给大家25个Matplotlib图的汇总,在数据分析和可视化中非常有用,文章较长,可以马起来慢慢练手. # !pip insta ...

  3. python画棒棒糖程序_用python 画几个简单图案

    from random importchoice # random 的choice方法能够在你给出的结果里随机选择一个importmatplotlib.pyplot as plt # 引入matplo ...

  4. python画圆形螺旋线_宝宝爱看小猪佩奇,很简单,让我们用python搞定它

    现在很多宝宝喜欢看小猪佩奇,今天就教大家用python的海龟画图画一个乖巧萌萌的小猪佩奇,引导对编程产生浓浓 的兴趣. 画图前引导 1.让我们打开百度,输入python进入python官网 2.在官网 ...

  5. python好学吗 老程序员-使用 Python 会降低程序员的编程能力吗?

    某些情况下会降低编程能力,某些情况下会提升编程能力,要看你怎么理解"编程能力". 1.使用 Python 会降低程序员的编程能力,这个假设成立的情形 如果强行要说使用Python可 ...

  6. python初学者编程指南_动态编程初学者指南

    python初学者编程指南 编程辅导 (PROGRAMMING TUTORIAL) Dynamic programming is an art, the more problems you solve ...

  7. python画静态烟花_人人都可以写的可视化Python小程序第二篇:旋转的烟花

    兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...

  8. python简单图画程序_用Python的Turtple画图形

    不知道各位是否还记得在小学或者初中的时候,我们接触过一种语言叫做logo语言,这个语言可以画正方形,画三角形,画圆.而用Python画图形也有点类似logo语言的意思. 在画图之前,我们需要启动一个模 ...

  9. df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...

     CDA数据分析师 出品   [导语]:今天我们教你用Python绘制全球疫情动态图,技术部分请看第二部分. 获取数据:扫描下方公众号回复关键字"全球疫情" 目前,全球新冠疫情还十 ...

  10. python画爱心原理_程序员式优雅表白,教你用python代码画爱心

    还能用python代码画爱心?还有这种操作?这是什么原理? 不相信python代码可以画爱心?先来一张效果图来看看效果吧!PyCharm pro Mac-PyCharm pro for Mac( Py ...

最新文章

  1. python基础 while循环练习
  2. sql必知必会(第四版) 学习笔记二 视图
  3. 汉语拼音+脑洞[BJDCTF 2nd]老文盲了
  4. 刺激战场战斗服务器无响应,绝地求生刺激战场网络异常怎么办 波动异常解决...
  5. Struts2中jsp page=xxx.action/jsp失效
  6. 常见的php笔试题(附答案)搜集整理
  7. redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死
  8. mysql删除密码代码_mysql 用户新建、受权、删除、密码修改
  9. IDEA打jar包时出现manifest.mf already exists in vfs解决办法
  10. 高项信息系统项目管理师考试大纲——重点知识
  11. Java中数据类型转换大全(个人总结)
  12. 英语总结系列(二十二):Baby偶遇GCT
  13. 普通摄像头的数据输出格式YUV与mjpeg之间联系、DCT离散余弦变换去噪跟压缩(待补充)
  14. detectron2 ImportError: cannot import name ‘_C‘ from ‘detectron2‘
  15. Python多进程之Pool
  16. GPS数据格式:NMEA-0183协议
  17. 树莓派基于QT实现利用USB转485模块进行串口通讯
  18. 第11章实验1:学生成绩管理系统V4.0
  19. 基于Ubuntu(x86)系统和STM32(Keil)编写C程序分别进行编程、验证
  20. 翻转——C++青少年一级考资料

热门文章

  1. 百度杀毒+7654联盟
  2. 新美大--软件测试--《社招、校招jd、公司具体介绍、培训发展、关于实习是什么,要求及常见问题、校招行程、校招常见问题》整理
  3. Codeforces1389 E. Calendar Ambiguity(数论)
  4. 717 1比特与2比特字符
  5. [GIS原理] 8.2 空间分析-邻近度分析-Delaunay三角网(德劳内)/泰森多边形(Thiessen多边形)/冯洛诺伊图(Voronoi图)
  6. safenet 超级狗 java调用 小计
  7. 白帽子讲Web安全(第 1 章 我的安全世界观)
  8. [周更]5.unity3D 三体运动(简易版)
  9. 磕技术、筑平台,浪潮存储如何持续破局?
  10. 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)