POJ 1390 Blocks(记忆化搜索+dp)
| 时限:5000 MS | 内存限制:65536K | |
| 提交材料共计: 6204 | 接受: 2563 |
描述
相应的图片如下:
图1
如果一些相邻的盒子都是相同的颜色,并且它左边的盒子(如果它存在)和它的右边的盒子(如果它存在)都是其他颜色的,我们称它为“盒子段”。有四个盒子段。那就是:金,银,铜,金。片段中分别有1,4,3,1方框。
每次您可以单击一个框,然后包含该框的整个段消失。如果这段是由k个方框组成的,你会得到k*k点。例如,如果你点击一个银盒子,银段消失了,你得到4*4=16点。
现在让我们看看下面的图片:
图2
第一个是最优的。
在这个游戏的初始状态下,找出你能得到的最高分数。
输入
输出量
样本输入
2
9
1 2 2 2 2 3 3 3 1
1
1
样本输出
Case 1: 29
Case 2: 1
解题思路:
将连续的若干个方块作为一个“大块”(box_segment) 考虑,假设开始一共有 n个“大块”,编号0到n-1 第i个大块的颜色是 color[i],包含的方块数目,即长度,是len[i]
用click_box(i,j)表示从大块i到大块j这一段消除后所能 得到的最高分,则整个问题就是: click_box(0,n-1)。
要求click_box(i,j)时,考虑最右边的大块j,对它有两种处理方式,要取其优者:
1) 直接消除它,此时能得到最高分就是: click_box(i,j-1) + len[j]*len[j]
2) 期待以后它能和左边的某个同色大块合并,考虑和左边的某个同色大块合并:
左边的同色大块可能有很多个,到底和哪个合并最 好,不知道,只能枚举。假设大块j和左边的大块 k(i<=k<j-1) 合并,此时能得到的最高分是多少呢?
是不是: click_box(i,k-1) + click_box(k+1,j-1) + (len[k]+len[j])
不对! 因为将大块k和大块j合并后,形成的新大块会在最右边。但直接将其消去,未必是最好的,也许它还应该和左边的同色大块合并,才更好
那么上面的dp不可用,需要改变问题的形式
__________________________________________________________________
click_box(i,j,ex_len) 表示: 大块 j 的右边已经有一个长度为ex_len的大块(该大块可能是在合并过程中形成的),且 j 的颜色和ex_len相同,在此情况下所能得到的最高分 。
于是整个问题就是求:click_box(0,n-1,0)
求click_box(i,j,ex_len)时,有两种处理方法取最优者,假设j和ex_len合并后的大块称作 Q
1) 将Q直接消除,这种做法能得到的最高分就是: click_box(i,j-1,0) + (len[j]+ex_len)2
2) 期待Q以后能和左边的某个同色大块合并。需要枚举可能和Q 合并的大块。假设让大块k和Q合并,则此时能得到的最大分数是:
click_box(i,k,len[j]+ex_len) + click_box(k+1,j-1,0)
click_box(i,j,ex_len) 递归的终止条件: i == j
代码:
#include<iostream>
#include<cstring>
using namespace std;
#define N 200 + 5
int dp[N][N][N];
struct segMent {
int len;
int color;
};
segMent segNum[N];
int clickBox(int i, int j, int len) {
if(dp[i][j][len] != -) return dp[i][j][len];
int result = (segNum[j].len + len)*(segNum[j].len + len);
if(i == j) return result;
result += clickBox(i, j-, );
for(int k = i; k < j; k++) {
if(segNum[k].color != segNum[j].color) continue;
int r = clickBox(k+, j-, ) + clickBox(i, k, segNum[j].len + len);
result = max(result, r);
}
dp[i][j][len] = result;
return result;
}
int main() {
int T;
cin >> T;
for(int t = ; t <= T; t++) {
int n;
cin >> n;
int last = -;
int count = -;
memset(dp, -, sizeof(dp));
for(int i = ; i < n; i++) {
int v;
cin >> v;
if(v != last) {
count++;
segNum[count].len = ;
segNum[count].color = v;
last = v;
} else segNum[count].len++;
}
cout << "Case " << t << ": " << clickBox(, count, ) << endl;
}
return ;
}
POJ 1390 Blocks(记忆化搜索+dp)的更多相关文章
- poj 1390 Blocks (记忆化搜索)
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4318 Accepted: 1745 Descriptio ...
- POJ 1088 滑雪(记忆化搜索+dp)
POJ 1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 107319 Accepted: 40893 De ...
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...
- HDU 1078 FatMouse and Cheese 记忆化搜索DP
直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555 因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解 但是复杂的拓补关系无法简单的用循环实现,所以直接采取记 ...
- 记忆化搜索 dp学习~2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...
- 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】
Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...
- hdu1331&&hdu1579记忆化搜索(DP+DFS)
这两题是一模一样的``` 题意:给了一系列递推关系,但是由于这些递推很复杂,所以递推起来要花费很长的时间,所以我要编程序在有限的时间内输出答案. w(a, b, c): 如果a,b,c中有一个值小于等 ...
- HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)
Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K ...
- hdu 4960 记忆化搜索 DP
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
随机推荐
- 如何对接oracle 建立pdb
Oracle数据库的结构是一个数据库实例下有许多用户,每一个用户有自己的表空间,即每一个用户相当于MySQL中的一个数据库.不久前下了oracle 12c的数据库,安装之后建user时才知道oracl ...
- PostegreSQL模板数据库
模板数据库 模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库设置和数据文件. CREATE DATABASE 实际上是通过拷贝一个现有的 ...
- 基于python Arcface 实现人脸检测和识别
虹软的人脸识别技术也是很强的,重要的是他免费提供了离线的sdk,还提供了实例,这个是目前几家研究人脸识别的大公司里面少有的.识别能力正常用还是可以的.我这个代码是调用的离线sdk实现的 ``` fro ...
- Android集成人脸识别demo分享
本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...
- pipenv安装.whl
windows下很多库安装不方便,主要是编译C之类的. 之前这样做: 1去https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载各种版本编译好的.whl 2 pi ...
- 配置java环境jdk
最近尝试改公司的项目中的一个后台管理系统,前后台都让我一个做,所以要配置一下java环境: 1. 按装jdk 1.6//2. 安装eclipse3. 安装maven4. 安装eclispe的maven ...
- MySQL中如何建立主从复制
## 1 概述 ## MySQL内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves) ...
- 猫眼电影爬取(二):requests+beautifulsoup,并将数据存储到mysql数据库
上一篇通过requests+正则爬取了猫眼电影榜单,这次通过requests+beautifulsoup再爬取一次(其实这个网站更适合使用beautifulsoup库爬取) 1.先分析网页源码 可以看 ...
- 20165303 2017-2017-2《Java程序设计》课程总结
1.我期待的师生关系 20165303我期望的师生关系 2.学习基础和C语言基础调查 20165303学习基础和C语言基础调查 3.linux安装及学习 20165303 预备作业3 Linux安装及 ...
- English trip M1 - AC6 How to make salad? Teacher:Patrick
In this lesson you will learn to give instructions. 在本课中,您将学习如何提供说明. 课上内容(Lesson) How to make a sal ...