题目描述

刚刚今天去游乐场玩,发现了一个新的游戏项目,游戏是这样的,场上一共有 n 个气球,它们的编号是0到n-1,然后每个气球上还有一个数字,我们使用数组nums来保存这些数字。

现在游戏要求刚刚戳破所有的气球。每当刚刚戳破一个气球i时,刚刚可以获得nums[left] * nums[i] * nums[right]个积分。这里的left和right指的是和i相邻的两个气球的序号。(注意每当刚刚戳破了气球i后,气球left和气球right就变成了相邻的气球。)

求所能获得积分的最大值。

输入数据

输入中有若干组测试样例,第一行为一个正整数T(T≤1000),表示测试样例组数。每组测试样例包含2部分: 第一部分有一行,包含1个正整数n(0≤n≤500),第二部分为一行,有n个数,第i个数表示num[i],(0≤num[i]≤100)。

输出数据

对每组测试数据,单独输出一行答案,表示最大的积分值。

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
#define N 100000+5
const double eps = 1e-15;int n, num[505];long long dp[505][505];//dp[i][j]: 第i~j个气球组合的最大分值int main() {int T;cin >> T;while(T--) {memset(num, 0, sizeof(num));memset(dp, 0, sizeof(dp));cin >> n;for (int i = 1; i <= n; i++)cin >> num[i];if (n == 0) {cout << 0 << endl;continue;}num[0] = 1, num[n+1] = 1;for (int i = 1; i <= n; i++)dp[i][i] = num[i-1] * num[i] * num[i+1];for (int len = 1; len <= n-1; len++)for (int i = 1; i <= n; i++) {int j = i + len;if (j > n) break;//枚举这一段最后一个扎爆的气球long long max_num = -1;for (int k = i; k <= j; k++) {max_num = max(max_num, dp[i][k - 1] + dp[k + 1][j] + num[i - 1] * num[k] * num[j + 1]);}dp[i][j] = max_num;}cout << dp[1][n] << endl;}return 0;
}

总结:
最开始思路错了,转移方程如果设计为max(dp[i][k - 1] + dp[k + 1][j] + num[k - 1] * num[k] * num[k + 1]),这样会有一个问题,我们把k扎爆了,[i, k - 1]这一段我们扎k-1的话,它右边的那个气球是谁我们就不知道了。所以要枚举最后一个扎爆的气球,加上num[i - 1] * num[k] * num[j + 1]。状态计算的过程要从[i, j]的长度由小到大进行枚举,最后的dp矩阵是一个三角矩阵(i>j全0)。结果还要注意对n==0特判一下。

【动态规划】气球游戏相关推荐

  1. 【青少年编程】【三级】打气球游戏

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  2. NKOJ——P1095——气球游戏

    时间限制 : 15000 MS 空间限制 : 65536 KB 评测说明 : 1s,64m 原题 问题描述 输入格式 输出格式 样例 样例 1 样例输入 1 样例输出 1 样例 2 样例输入 2 样例 ...

  3. JavaScript实战——打气球游戏

    源码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8& ...

  4. 动态规划---石子游戏

    动态规划---石子游戏 石子游戏(leetcode877) 石子游戏(leetcode1140) 石子游戏(leetcode1686) 石子游戏(leetcode877) 题目描述 亚历克斯和李用几堆 ...

  5. 动态规划-多边形游戏算法

    动态规划-多边形游戏算法 一.多边形游戏简介 首先,多边形游戏是一个单人玩的游戏. 游戏初始时是由n(n>=3)个顶点构成的多边形,每个顶点被赋予一个整数值,每条边被赋予一个运算符"+ ...

  6. 【编程题】【Scratch三级】2019.09 打气球游戏

    打气球游戏 1.准备工作 (1)角色"Wand","Balloon1": (2)默认白色背景. 2.功能实现 (1)程序开始,魔法棒在舞台的底部不停左右移动: ...

  7. 打气球游戏-第14届蓝桥杯STEMA测评Scratch真题精选

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第118讲. 蓝桥杯选拔赛现已更名为STEMA,即ST ...

  8. 【蓝桥杯选拔赛真题58】Scratch打气球游戏 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

    目录 scratch打气球游戏 一.题目要求 编程实现 二.案例分析 1.角色分析

  9. 【日常点滴019】Python制作流浪气球游戏(导弹射击类)

    Python制作流浪气球游戏(导弹射击类) 教学课程代码(分步教学版) 1.构建全局通用代码结构 2.构建气球精灵类 3.构建导弹精灵类 4.碰撞检测 5.构建游戏信息类 (最终完整代码) 教学课程代 ...

最新文章

  1. 泊松回归、gamma回归、Tweedie回归等广义线性回归模型GLM的评估指标:校准曲线、 洛伦兹曲线、卡方检验、AIC、BIC、偏差(Deviance)指标
  2. Deepgreen Greenplum DBA小白普及课之三(备份问题解答)
  3. dell 服务器 加ssd硬盘,DELL服务器加SSD硬盘.doc
  4. avl删除根节点图解_图解 6 种树,你心中有数吗。。。
  5. Redis客户端命令行redis-cli操作
  6. JAVA复习5(集合—— Vetor)
  7. 【前端就业课 第一阶段】HTML5 零基础到实战(十)JavaScript基础一篇入门
  8. 蓝桥杯 ALGO-64 算法训练 大小写判断
  9. 里签名boot有什么用_为什么大家都用苹果企业签名呢?
  10. Java语言中几个常用的包
  11. 2016级算法第五次上机-C.Bamboo和Coco
  12. VS中,一个头文件使用另外一个头文件的静态变量,要谨慎
  13. Atitit.电脑图片与拍摄图片的分别
  14. Android手机sock5代理免root
  15. Java常用框架简介
  16. css的鼠标手势大全
  17. 计算机网络安全及防火墙技术任务书,《毕业设计(论文)-计算机网络安全技术分析》.doc...
  18. 【收藏】2020届互联网公司校招时间总表
  19. 有关数据的“那些事儿”,百度云发声啦!
  20. iOS使用GCDSocketManager实现长连接

热门文章

  1. Vue/Vuex入门、Vuex 介绍 Vuex是什么 Vuex说明总结、Vuex主要五个内容
  2. jboss6 jms 配置使用
  3. win10怎么添加开机启动项
  4. xml配置文件中mysql数据库字段不出现提示信息解决办法
  5. java计算机毕业设计果之芒农场销售系统(附源码、数据库)
  6. 性状的pearson相关与表型相关的差异
  7. Spinnaker实践-Spinnaker基础简介
  8. 做到这6点你才算摸到了项目管理的门
  9. 从键盘任意输入一个年份,和一个月份,输出该年这个月份有多少天,用程序实现 比如: 输入年份: 2021 输入月份: 12 输出:2021年12月份共
  10. 利用ZXing生成和读取二维码