每日一道算法题(3)--戳气球问题

这篇博客探讨了一个有趣的编程问题——戳气球,其中每个气球都有分数,戳破气球会根据相邻气球的分数获得额外奖励。作者通过动态规划的方法,详细分析了解题思路,构建二维数组记录区间最高分数,并用代码展示了如何找到戳破所有气球的最高可能得分。动态规划在这里起到了关键作用,帮助找到最优解。

题目

    戳气球问题 :输入一个包含非负数整数的数组nums代表一排气球, nums[i]代表第i个气球的分数。现在, 你要戳破所有的气球,请计算出最高的分数。

    分数的计算规则比较特别,当戳破第i个气球时, 可以获得nums[left] * nums[right] * nums[i]的分数,其中nums[left]和nums[right]代表气球i的左右相邻气球的分数。

    nums[left]不一定就是nums[i - 1],nums[right]不一定就是nums[i + 1]。比如戳破了nums[3], 现在nums[4]的左侧就和nums[2]相邻了。

思路分析 

    我们首先考虑的是‘动态规划’,此问题最小的子问题为戳破最后一个气球,但这个最后一个戳破的气球可以是范围内的其中一个,所以我们借助循环,通过左右区域的最高分数就可以求出以当前气球为最后一个戳破最高分数。

    我们可以建立一个二维数组来记录当前区间的最高分数。

0
0
0
0
0

在求当前最高分时,我们要先求出左右区域的最高分数,所以大概的遍历顺序为下图

从下往上从左往右遍历。由于被戳破的最后一个气球的位置不固定,所以我们要求出的左右区域的最高分数也不止两个。通过循环我们就可以求出所有不同位置的左右区域的最高分数。不同最后一个被戳破的气球的位置对应的左右区域的最高分数的分布为下图。

代码展示
 

static public int maxCoins(int[] nums) {
		int n = nums.length;
		//为了方便,我们就让下标从一开始,所以边界为0到n + 1;
		int[] points = new int[n + 2];//都初始化为0
		for(int i = 1; i <=  n; i++) {
			points[i] = nums[i - 1];
		}
		points[0] = points[n + 1] = 1;//初始化为一从而保证了在后续的循环中防止边界的分数影响最终结果
		int[][] dp = new int[n + 2][n + 2];
		for(int i = n; i >= 0; i--)
			for(int j = i + 1; j < n + 2; j++) {
				for(int k = i + 1; k < j; k++) {
					//(i,j) i到j为开区间
					dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k][j] + points[i] * points[j] * points[k]);
					/*因为i~k和k~j之间的气球已经全破了,所以k的左右为i,j */
				}
			}
		return dp[0][n + 1];
	}

垃圾分类小程序-毕业设计,基于微信小程序+SpringBoot+MySql开发,源码+数据库+开题报告+毕业论文+视频演示现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本垃圾分类小程序就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此垃圾分类小程序使用跨平台的可开发大型商业网站的HTML技术,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发,后台采用Java语言的SpringBoot框架,前台采用VUE框架和layui样式,垃圾分类小程序端实现页面基本用uni app框架写作。垃圾分类小程序管理员功能有个人中心,管理员管理,意见反馈管理,视频类型管理,垃圾类型管理,新闻类型管理,论坛信息管理,环保视频管理,环保知识管理,垃圾信息管理,环保新闻管理,用户管理,知识问答试卷管理,试题管理,测试管理,轮播图管理。用户可以在微信小程序上面注册登录,查看各种环保信息和垃圾信息,还可以参加知识问答等操作。垃圾分类小程序的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。关键词:垃圾分类小程序;uni app框架;MySQL;VUE;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值