UVALive 4490 Help Bubu
题目大意:有n本书,高度值域为8,现可以把k本书拿出来再放进去,相邻的、高度相同的书算作一块,最小化块的个数。n=100。
强烈建议大家不要在做完区间DP后做别的DP题:区间DP是整体考虑,而一般DP是考虑以i为末尾,思路完全不同。
难点好像就在于设状态,状态设出来就可以大力转移了。
首先f[i][j],表示到第几本书、用了几次是肯定要设的,但是这样做会缺少很多信息。在转移的时候,我们需要知道最后一位是什么?所以开到f[i][j][k]。
这个就可以DP了。但是答案怎么统计呢?如果最终答案是把几种高度全部扣出来,答案就要比DP值大,但这是我们状态中不能体现的。
看到值域这么小,直接设f[i][j][k][l],表示到第i本书、用了j次取书机会、在书架上的书的集合是k,最后一本书是l的最小块数。
初始化:
f[i+][i][bin[h[i+]]][h[i+]]=;
初始化
转移方程就是讨论一下就可以出来的东西了。
1.当前书取出来:
f[i+][j+][k][l]=min(f[i+][j+][k][l],f[i][j][k][l]);
转移1
2.当前书不取,这时要与最后一位做比较:
f[i+][j][k|bin[h[i+]]][h[i+]]=min(f[i+][j][k|bin[h[i+]]][h[i+]],f[i][j][k][l]+(h[i+]!=l));
转移2
其中bin表示2的多少次方。
在统计答案的时候,要这么统计:
for(int i=;i<=k;++i)
for(int j=;j<bin[];++j)
for(int k=;k<;++k)
if(f[n][i][j][k]!=f[][][][])
Ans=min(Ans,f[n][i][j][k]+num[U^j]);
统计答案
其中num表示二进制下有多少个1。
完整代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <complex>
#include <stack>
#define LL long long int
#define dob double
#define FILE "4490"
using namespace std; const int N = ;
int n,k,bin[],h[N],f[N][N][<<][],t,Ans,num[<<]; inline int gi(){
int x=,res=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')res*=-;ch=getchar();}
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*res;
} inline void Min(int &x,int y){
if(x>y)x=y;
} inline void solve(int U=){
for(int i=;i<=n;++i)U|=bin[h[i]=gi()-];
memset(f,/,sizeof(f));Ans=f[][][][];
f[][][bin[h[]]][h[]]=;
for(int i=;i<n;++i){
f[i+][i][bin[h[i+]]][h[i+]]=;
for(int j=;j<=i && j<=k;++j)
for(int k=;k<bin[];++k)
for(int l=;l<;++l)
if(f[i][j][k][l]!=Ans){
Min(f[i+][j+][k][l],f[i][j][k][l]);
Min(f[i+][j][k|bin[h[i+]]][h[i+]],f[i][j][k][l]+(h[i+]!=l));
}
}
for(int i=;i<=k;++i)
for(int j=;j<bin[];++j)
for(int k=;k<;++k)
if(f[n][i][j][k]!=f[][][][])
Min(Ans,f[n][i][j][k]+num[U^j]);
printf("Case %d: %d\n\n",++t,Ans);
} int main()
{
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
bin[]=;for(int i=;i<;++i)bin[i]=bin[i-]*;
for(int i=;i<bin[];++i)num[i]=num[i/]+(i&);
while((n=gi()) && (k=gi()))solve();
fclose(stdin);fclose(stdout);
return ;
}
Help Bubu
UVALive 4490 Help Bubu的更多相关文章
- Help Bubu UVALive - 4490
传送门 题目大意 有n本书,最多k次操作,每次操作可以把一本书拿出来,放到一个位置去,有一个指标较mess度,他是书的高度的段数,连续的书高度一样算一段,现在给你最先开始各个位置上的书的高度,求操作后 ...
- UVALive 4490 压缩DP
转载自http://blog.csdn.net/zstu_zlj/article/details/9903589 没有接触过压缩DP.位运算也不太熟.所以理解了思路还是不懂代码.
- UVA Live Archive 4490 Help Bubu(状压dp)
难点在于状态设计,从左向右一本书一本书的考虑,每本书的决策有两种拿走或者留下, 对于拿走后的书,之后要放回,但是决策过程中不知道到往哪里放, 虽然前面的书的种类确定,可能是往后面放更优,而后面的书的类 ...
- UVALive - 4108 SKYLINE[线段树]
UVALive - 4108 SKYLINE Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug ...
- UVALive - 3942 Remember the Word[树状数组]
UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...
- UVALive - 3942 Remember the Word[Trie DP]
UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...
- 思维 UVALive 3708 Graveyard
题目传送门 /* 题意:本来有n个雕塑,等间距的分布在圆周上,现在多了m个雕塑,问一共要移动多少距离: 思维题:认为一个雕塑不动,视为坐标0,其他点向最近的点移动,四舍五入判断,比例最后乘会10000 ...
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- UVALive 6508 Permutation Graphs
Permutation Graphs Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
随机推荐
- 《java.util.concurrent 包源码阅读》03 锁
Condition接口 应用场景:一个线程因为某个condition不满足被挂起,直到该Condition被满足了. 类似与Object的wait/notify,因此Condition对象应该是被多线 ...
- tensorflow 学习笔记(转)
转自:http://blog.csdn.net/qq_32166627/article/details/52734387 侵删. tensorflow中有一类在tensor的某一维度上求值的函数.如: ...
- 【Mysql知识补充】
一.子查询 1.定义 子查询是将一个查询语句嵌套在另一个查询语句中.内层查询语句的查询结果,可以为外层查询语句提供查询条件.子查询中可以包含:IN.NOT IN.ANY.ALL.EXISTS 和 NO ...
- SpringMvc架构下css、js、jpg加载失败问题
SpringMvc架构下css.js.jpg加载失败问题 springMvc搭建成功后,页面出现一些错误,jsp.js等静态资源加载失败.导致页面没有显示任何样式以及 此处原因很简单,是因为相对路径在 ...
- Numpy数组对象的操作-索引机制、切片和迭代方法
前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法.使用索引和切片的方法选择元素,还有如何数组的迭代方法. 一.索引机制 1.一维数组 In [1]: a = np.arange ...
- 这些 Drawable 的小技巧,你都了解吗?
一.前言 在 Android 的开发过程中,Drawable 经常会被用到,一般会用 Drawable 为 View 设置一个显示的效果.而在 Android 下,也提供了很多 Drawable 的默 ...
- MLR算法[Paper笔记]
介绍 MLR算法是alibaba在2012年提出并使用的广告点击率预估模型,2017年发表出来. 如下图,LR不能拟合非线性数据,MLR可以拟合非线性数据,因为划分-训练模式. 讨论,非线性拟合能力: ...
- 360提供的php防注入代码
<?php //Code By Safe3 function customError($errno, $errstr, $errfile, $errline) { echo "< ...
- yum中$releasever、 $basearch等变量含义
[root@kickstart ~]# rpm -qf /etc/redhat-release centos-release--4.1708.el7.centos.x86_64 yum中的$relea ...
- 将项目打包成jar,如何又将jar还原成项目
一.将项目打包成jar 第一步: 选择项目,鼠标右键,选择export ,出现如下 接下来就是点击Next,Next,最后点击Finish 后 会生成jar 二.将jar还原成项目 第一步 用反编译工 ...