题目就是这样,接下来我们来分析这个题目

分析

我们用click_box(i,j)来表示消除大块 ij 所得到的最大分数,用 len[ i ]来表示第 i 个大块的长度。

这时我们就是要求click_box(0,n-1),n是大块的个数。

首先,我们从右往左来看,要求click_box( i , j ),看右边第一个大块 j ,它有两种处理方式:

一:直接消除,得分为 click_box( i , j-1)+len[ j ]*len[ j ];

二:期待 j 左边有和它颜色相同的大块,设为 k,得分为

 click_box(i,k-1) + click_box(k+1,j-1) + (len[k]+len[j])*(len[k]+len[j])

   到这一步,就有人认为这就是最终的结果了,错,并不是。为什么呢,原因是如果 j 左边除了 k 之外如果还有和 j 颜色相同的大块呢?所以我们还要进一步考虑一下。

我们换一个表示方式,加一个参数,用click_box(i,j,exlen)来表示消除大块 i 到 j 所得到的最大分数。

exlen表示 j 右边长度为 exlen 的大块,且颜色和 j  相同。这是问题就转化为求 ckick_box(0,n-1,0).

假设 j 和 exlen 合并后的大块为 Q,我们从大块 Q 开始处理,Q 有两种处理方式:

一:直接消除,得分为 ckick_box(i,j-1,0) + (len[ j ]+exlen)*(len[ j ]+exlen)

二:若 j 的左边还有与 j 的颜色相同的大块,设为 k,这时我们要消除 i 到 k 之间的大块和 k+1到 j-1之间的大块,结果为

click_box(i,k,len[ j ]+exlen)+click_box(k+1,j-1,0)

经过上述分析就可以写代码了

#include<iostream>
#include<algorithm>
using namespace std;struct Block {int color;int len;
};struct Block segment[200];
int score[200][200][200];   //存放结果,避免重复计算int click_box(int start, int end, int extra_len) {int i, result, temp;if (score[start][end][extra_len] > 0) {return score[start][end][extra_len];}result = segment[end].len + extra_len;result = result*result;  //end和 extra_len一起消去后的得分if (start == end) {score[start][end][extra_len] = result;return score[start][end][extra_len];}result = result + click_box(start, end - 1, 0);for (i = end - 1; i >= start; i--) {if (segment[i].color != segment[end].color) {continue;}temp = click_box(start, i, segment[end].len + extra_len) + click_box(i + 1, end - 1, 0);if (temp > result) {result = temp;}}score[start][end][extra_len] = result;return score[start][end][extra_len];
}int main() {int t, n, i, j, end, color;cin >> t;   //测试数据组数for (i = 0; i < t; i++) {cin >> n;    //盒子总数end = 0;     //大块总数cin >> segment[end].color;segment[end].len = 1;for (j = 1; j < n; j++) {cin >> color;if (segment[end].color == color) {segment[end].len++;}else {end++;segment[end].len = 1;segment[end].color = color;}}memset(score, 0, sizeof(score));cout << "Case:" << i + 1 << " " << click_box(0, end, 0) << endl;}system("pause");return 0;
}

为了避免重复计算,用了一个数组来存放中间结果

动态规划——方盒游戏详解相关推荐

  1. Python Tkinter——数字拼图游戏详解版

    Python Tkinter 实践系列--数字拼图游戏详解版 import random #Python中的random是一个标准库用于生成随机数.随机整数.还有随机从数据集取数据. import t ...

  2. c语言背包问题装字母,C语言动态规划之背包问题详解

    01背包问题 给定n种物品,和一个容量为C的背包,物品i的重量是w[i],其价值为v[i].问如何选择装入背包的物品,使得装入背包中的总价值最大?(面对每个武平,只能有选择拿取或者不拿两种选择,不能选 ...

  3. 状态压缩动态规划部分习题详解

    状态压缩动态规划部分习题详解 状压DP部分题目详解 状态压缩动态规划部分习题详解 简介 经典子集类问题 原子弹 最短路与状压DP结合 送礼物 P3959宝藏 旅游 经典网格类 铺地砖 一笔画 其他类型 ...

  4. 取石子游戏详解NIM

    取石子游戏详解NIM 分类: 编程之美2014-09-13 09:38 478人阅读 评论(3) 收藏 举报 编程之美 目录(?)[+] http://blog.csdn.net/pipisorry/ ...

  5. 【C语言】扫雷小游戏详解

    [C语言]扫雷小游戏详解 前言: 还记得大明湖畔的夏雨荷,电脑课上的扫雷吗? ---------------------------是 他 吗--------------------------- 没 ...

  6. 动态规划设计方法详解最长递增子序列

    很多读者反应,就算看了前文动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想. 最长递增子序列(Lon ...

  7. 动态规划——背包问题(详解)

    动态规划是我最早接触的算法,一开始非常简单,固定模板题,后来愈发愈发难起来了,条件,状态压缩等等,难点主要是,状态怎么表示,状态转移方程怎么写,这篇文章将会从背包五大问题详解,希望能帮助到大家去类比, ...

  8. 100行实现《贪吃蛇》小游戏详解(Qt)

    目录 游戏说明 游戏效果展示 游戏代码详解 ​关键数据结构 初始化游戏界面 游戏部分 提示部分 蛇逻辑 小蛇的初始化 边界判断 蛇吃食物判断 随机生成食物 是否撞到自己 小蛇的移动 游戏主体逻辑 定时 ...

  9. 牛客 小朋友做游戏详解<每日一题分享>

    题目: 条件: 1. 闹腾的小朋友挨在一起的话就会出现打闹行为 导致游戏无法进行 故每个闹腾的小朋友两边必须是安静的小朋友 (选择参加游戏的小朋友 必须满足 安静小朋友的人数>或=闹腾小朋友人数 ...

最新文章

  1. Java泛型-为什么允许“扩展T”但不允许“实现T”?
  2. webpack vue app.js自动注入页面.为app.js增加随机参数
  3. RHEL5.5配置DHCP服务器以及DHCP中继
  4. 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
  5. PHP动态多文件上传的具体代码
  6. Linux查看指定进程占用mem,Linux查看占用mem的进程脚本
  7. 【MySQL】MySQL自带的数据库
  8. 谈一谈Java 中 1000==1000 为false,而100==100 为true?
  9. QT5开发及实例学习之十四Qt5排版功能
  10. azure 使用_使用Azure Data Studio开始您的旅程
  11. Linux虚拟网络原理小结
  12. 开源盛世:谈谈开源代码的使用与安全风险
  13. html实现多选框传值,解决Django中checkbox复选框的传值问题
  14. 好难过!八年深漂,搞Android开发要价50万,面了六家公司,竟一个offer都没拿到!
  15. pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例
  16. Js逆向教程20-Hook基础
  17. 联想E431 安装ubuntu16.04
  18. STM8的TIM1定时器简单使用
  19. 每日一面 - sqrt (2)约等于 1.414,如何求sqrt (2)小数点后 10 位
  20. 2021年流动式起重机司机报名考试及流动式起重机司机找解析

热门文章

  1. java练习--实现会员注册升级
  2. 使用d3实现类似脑图,股权穿透图,关系图谱
  3. CMP指令、标志位、JCC指令总结
  4. 直流电机数学模型及稳态曲线题
  5. 【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)
  6. New Concept English Two 29 79
  7. AutoJs学习-自动化抖音的一些UI
  8. 谷歌浏览器控制台调试器的基本使用方法,常用方法必备,手把手教学
  9. 堆 — — 手动改写堆及经典面试题【TopK】
  10. ​【JTeam Champion NFT】nft是什么意思?nft概念股又是什么?nft概念股有哪些?​