不止代码:ybtoj-消除木块(区间DP)
题目描述
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)相关推荐
- 【AtCoder - 4244 】AtCoder Express 2 (区间dp 或 暴力枚举,思维)
题干: In Takahashi Kingdom, there is a east-west railroad and N cities along it, numbered 1, 2, 3, ... ...
- 不止代码:乘法游戏 题解(区间dp)
题目描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌. ...
- BZOJ.1032.[JSOI2007]祖码(区间DP)
题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- [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 ...
- 【区间dp】uva10003+ uva 1626 括号匹配问题 【有空自己记忆化写一下!!!】
讲道理,其实我还不是太懂,这个题看到了两种写法 之前大概想的差不多,要这样实现呀: 常规写法,大概n--3 递归写法,稍微好理解一点 好了,接下来自从看了liuchuo的博客我要变身玛丽苏橙色了 题目 ...
- POJ 2955 Brackets (区间DP)
题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- HDU 5115 Dire Wolf ——(区间DP)
比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...
最新文章
- 在一个无序的int数组上构建一个最小堆的时间复杂度_漫画:寻找无序数组的第k大元素(修订版)...
- 应收应付重组配置和操作解析
- css3 下边框缓缓划过_一篇文章带你了解CSS3按钮知识
- Django 模型与 Mysql 数据类型对应
- Java解析JSON文件
- 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?
- shell脚本检查进程脚本
- php与mysqli,如何通过PHP与MySQLi保持联系
- EC600 QuecPython开发环境搭建、固件下载,最方便的OpenCPU物联网4G通信解决方案
- 广东省计算机应用专业综合理论知识,(计算机应用技术专业综合理论考试说明.doc...
- 网页编码_Python获取网页编码(apparent_encoding)
- java学生成绩管理系统(GUI界面+文件保存+排序)
- 【Java攻城狮宝典】04-for循环(答案)
- Linux下调整屏幕分辨率
- 网页二维码生成器纯js代码带logo图纯前端合成
- 再议访问者模式 - Visitor vs Acyclic Visitor
- 第十五期】Monica:单身滴美女程序员 多图!
- Dataset之CV:人工智能领域数据集集合(计算机视觉CV方向数据集)之常见的计算机视觉图像数据集大集合(包括表面缺陷检测数据集,持续更新)
- 1.关于嵌入式开发软件工程师的理解
- 游戏开发 入职6个月 牢骚型小结
热门文章
- dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...
- ubuntu流量监控_linux - 实时流量监控
- vb6 由于超出容量限制 不能创建新事务_分布式限流?你也能轻松玩转(没啥新技术)...
- java鼠标改变窗口大小监听事件_java – 当用户拖动鼠标时,监听JFrame调整事件大小?...
- 如何动态的生成某种类型的集合呢_知乎画报」的移动端动态化工程实践
- java读取文件跳过_在Java中读取文本文件-为什么跳过行?
- c++十进制转二进制_二进制与十进制如何互相转换?
- c#物联网_C# 基础知识系列- 16 开发工具篇
- java实用教程——组件及事件处理——对话框(颜色对话框,自定义对话框)
- 软件构造学习笔记-实验4