帮助_NOI导刊2010提高(03)
题目描述
Bubu的书架乱成一团了!帮他一下吧!
他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度是5-,这实在是太乱了。
Bubu想尽可能地减少混乱度,但他有点累了,所以他决定最多取出k本书,再随意将它们放到书架上。你能帮助他吗?
输入格式
最多会有20组测试数据。每组测试数据开头为两个整数n,k(l≤k≤n≤100),表示总共有n本书,最多可以进行k次搬书操作。接下来一行有n个整数,表示每本书的高度,从左到右。每本书的高度是25到32间的整数。最后一组数据后有一行n=k=0。
输出格式
对于每一组数据,输出Case标号和最终最小的混乱度。在每组数据后打印一个空行。
输入输出样例
5 2
25 25 32 32 25
5 1
25 26 25 26 25
0 0
Case 1:2
Case 2:3
分析:
本题给定的数据显然让我们想到状态压缩DP,那么我们可以设计状态f[i][j][s][l],表示前i个选了j个状态为s最后一个为l所能得到最小的混乱度,然后进行状态转移即可。
然后发现我的代码最后一个点超时,死活过不去。。。所以我开了O2。。。
CODE:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int M=;
const int N=;
int f[][M][N][];
int a[M],b[N];
int n,k,cnt;
int get(){
char c=getchar();
int res=,f=;
while (c>''||c<''){
if (c=='-') f=-;
c=getchar();
}
while (c<=''&&c>=''){
res=(res<<)+(res<<)+c-'';
c=getchar();
}
return res*f;
}
int main(){
for(int i=;i<(<<);i++){
b[i]=;
for(int j=;j<;j++)
if(i&(<<j)) b[i]++;
}
while(~scanf("%d%d",&n,&k)&&(n+k)){
int S=,maxn=;
for(int i=;i<=n;i++){
a[i]=get();
a[i]-=;
S=S|(<<a[i]);
maxn=max(maxn,a[i]);
}
maxn++;
memset(f[],,sizeof(f[]));
f[][][][maxn]=;
f[][][(<<a[])][a[]]=;
int cur=,pre=;
for(int i=;i<n;i++){
cur=pre^;
memset(f[cur],,sizeof(f[cur]));
for(int j=;j<=k;j++){
for(int s=;s<=S;s++){
for(int l=;l<=maxn;l++){
if(f[pre][j][s][l]==) continue;
f[cur][j][s|(<<a[i+])][a[i+]]=min(f[cur][j][s|(<<a[i+])][a[i+]],f[pre][j][s][l]+(a[i+]==l?:));
f[cur][j+][s][l]=min(f[cur][j][s][l],f[pre][j][s][l]);
}
}
}
pre=cur;
}
int ans=;
for(int j=;j<=k;j++){
for(int s=;s<=S;s++){
for(int l=;l<maxn;l++){
if(f[cur][j][s][l]==)continue;
int now=S^s;
ans=min(ans,f[cur][j][s][l]+b[now]);
}
}
}
printf("Case %d: %d\n\n",++cnt,ans);
}
return ;
}
帮助_NOI导刊2010提高(03)的更多相关文章
- 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告
P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]
P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...
- P1799 数列_NOI导刊2010提高(06)
P1799 数列_NOI导刊2010提高(06)f[i][j]表示前i个数删去j个数得到的最大价值.if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); else ...
- P1771 方程的解_NOI导刊2010提高(01)
P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...
- P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- P1794 装备运输_NOI导刊2010提高(04)
P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ...
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
随机推荐
- 攻防世界--Shuffle
测试文件:https://adworld.xctf.org.cn/media/task/attachments/a03353e605bc436798a7cabfb11be073 1.准备 获得信息 3 ...
- 【学习总结】尚硅谷2019java数据结构和算法
相关链接 github:javaDSA 目录 第一章 内容介绍和授课方式 第二章 数据结构和算法概述 第三章 稀疏数组和队列 第四章 链表 第五章 栈 第六章 递归 第七章 排序算法 第八章 查找算法 ...
- unity DOTween Pro的使用--简化流程--自动播放
当gameobject setActive(true)的时候自动播放动画 1) 添加DoTween Animation. 设置动画效果, 略 选中 AutoPlay, 取消 AutoKill 2) 在 ...
- (解决某些疑难杂症)Ubuntu16.04 + NVIDIA显卡驱动 + cuda10 + cudnn 安装教程
一.NVIDIA显卡驱动 打开终端,输入: sudo nautilus 在新打开的文件夹中,进入以下路径(不要用命令行): 左下角点计算机,lib,modules 这时会有几个文件夹,对每个文件夹都进 ...
- ActiveMQ修改连接的用户名密码
安装目录下conf/activemq.xml 添加如下内容: <plugins> <simpleAuthenticationPlugin> <users> < ...
- vue之路由传参三种基本方式
现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据. 父组件中: <li v-for="article in articles" @click= ...
- sentinel集群docker-compose.yml配置
redis安装 version: '3.1'services: master: image: redis container_name: redis-master ports: - 6379:6379 ...
- 分组函数 partition by 的详解,与order by 区别
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- 前端必用正则(js)
手机号 /^1((3[\d])|(4[5,6,9])|(5[0-3,5-9])|(6[5-7])|(7[0-8])|(8[1-3,5-8])|(9[1,8,9]))\d{8}$/ 大写字母 /^[A- ...
- spring-boot整合Mybatis案例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 3.2.5 2.Maven Plugin管理 <?xml version="1.0&q ...