题目描述

n个木块排成一列,每个木块都有一个颜色。

每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除。 如果一次性消除了k个木块,那么就会得到k*k分。

给定你一个游戏初始状态,请你求出最高得分是多少。

解析

区间dp
首先可以把同色合并,从而将数列转化为一个由若干段组成的新的数列
用dp[i][j][k]表示新数列中在加上后面有k个与第j段颜色相同的木块的情况下,第i到j段的最大得分
那么就可以不断把第r段尝试与之前的同色段连接消除,并继续递归:

for(int i=l;i<r;i++){if(co[i]==co[r]){dp[l][r][k]=max(dp[l][r][k],solve(l,i,len[r]+k)+solve(i+1,r-1,0));}}

从而完成本题

代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <queue>
#include <string>
#include<map>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a));
#define ull unsigned ll
using namespace std;
const int N=250;
int m,n,ans;
int dp[N][N][N],a[N];
int len[N],co[N],tot;
int solve(int l,int r,int k){if(l>r) return 0;if(dp[l][r][k]) return dp[l][r][k];if(l==r) return dp[l][r][k]=(len[l]+k)*(len[l]+k);dp[l][r][k]=solve(l,r-1,0)+(len[r]+k)*(len[r]+k);for(int i=l;i<r;i++){if(co[i]==co[r]){dp[l][r][k]=max(dp[l][r][k],solve(l,i,len[r]+k)+solve(i+1,r-1,0));}}return dp[l][r][k];
}
int main(){scanf("%d",&m);for(int p=1;p<=m;p++){scanf("%d",&n);mem(dp,0);mem(len,0);mem(co,0);tot=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(i==1||a[i]!=a[i-1]){co[++tot]=a[i];len[tot]=1;}else len[tot]++;}printf("Case %d: %d\n",p,solve(1,tot,0));}
}

心得

本题参考了题解。。。
主要就是这个dp的定义和向前递归的思想没有想到
(本来一直在枚举长度找递推式awa)
而其实递推能做的dp递归应该也可以,时间复杂度不会差太多(也就亿点点 )
所以:

dp要优先考虑递归!!!

thanks for reading!

不止代码:ybtoj-消除木块(区间DP)相关推荐

  1. 【AtCoder - 4244 】AtCoder Express 2 (区间dp 或 暴力枚举,思维)

    题干: In Takahashi Kingdom, there is a east-west railroad and N cities along it, numbered 1, 2, 3, ... ...

  2. 不止代码:乘法游戏 题解(区间dp)

    题目描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. ...

  3. BZOJ.1032.[JSOI2007]祖码(区间DP)

    题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问 ...

  4. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  5. [CF1107E]Vasya and Binary String【区间DP】

    题目描述 Vasya has a string s of length n consisting only of digits 0 and 1. Also he has an array a of l ...

  6. 【区间dp】uva10003+ uva 1626 括号匹配问题 【有空自己记忆化写一下!!!】

    讲道理,其实我还不是太懂,这个题看到了两种写法 之前大概想的差不多,要这样实现呀: 常规写法,大概n--3 递归写法,稍微好理解一点 好了,接下来自从看了liuchuo的博客我要变身玛丽苏橙色了 题目 ...

  7. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  8. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...

  9. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

最新文章

  1. 在一个无序的int数组上构建一个最小堆的时间复杂度_漫画:寻找无序数组的第k大元素(修订版)...
  2. 应收应付重组配置和操作解析
  3. css3 下边框缓缓划过_一篇文章带你了解CSS3按钮知识
  4. Django 模型与 Mysql 数据类型对应
  5. Java解析JSON文件
  6. 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?
  7. shell脚本检查进程脚本
  8. php与mysqli,如何通过PHP与MySQLi保持联系
  9. EC600 QuecPython开发环境搭建、固件下载,最方便的OpenCPU物联网4G通信解决方案
  10. 广东省计算机应用专业综合理论知识,(计算机应用技术专业综合理论考试说明.doc...
  11. 网页编码_Python获取网页编码(apparent_encoding)
  12. java学生成绩管理系统(GUI界面+文件保存+排序)
  13. 【Java攻城狮宝典】04-for循环(答案)
  14. Linux下调整屏幕分辨率
  15. 网页二维码生成器纯js代码带logo图纯前端合成
  16. 再议访问者模式 - Visitor vs Acyclic Visitor
  17. 第十五期】Monica:单身滴美女程序员 多图!
  18. Dataset之CV:人工智能领域数据集集合(计算机视觉CV方向数据集)之常见的计算机视觉图像数据集大集合(包括表面缺陷检测数据集,持续更新)
  19. 1.关于嵌入式开发软件工程师的理解
  20. 游戏开发 入职6个月 牢骚型小结

热门文章

  1. dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...
  2. ubuntu流量监控_linux - 实时流量监控
  3. vb6 由于超出容量限制 不能创建新事务_分布式限流?你也能轻松玩转(没啥新技术)...
  4. java鼠标改变窗口大小监听事件_java – 当用户拖动鼠标时,监听JFrame调整事件大小?...
  5. 如何动态的生成某种类型的集合呢_知乎画报」的移动端动态化工程实践
  6. java读取文件跳过_在Java中读取文本文件-为什么跳过行?
  7. c++十进制转二进制_二进制与十进制如何互相转换?
  8. c#物联网_C# 基础知识系列- 16 开发工具篇
  9. java实用教程——组件及事件处理——对话框(颜色对话框,自定义对话框)
  10. 软件构造学习笔记-实验4