也许更好的阅读体验

\(\mathcal{Description}\)

Bubu的书架乱成一团了!帮他一下吧!

他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度是5,这实在是太乱了。

Bubu想尽可能地减少混乱度,但他有点累了,所以他决定最多取出k本书,再随意将它们放到书架上。你能帮助他吗?

\(\mathcal{Solution}\)

考虑取出一本书把其认为是删掉这本书,因为总有办法使其不会影响到后面的取书过程

特殊的是如果将一种书全部删掉,那么应该还是会有1的混乱度

如果考虑\(dp\)方式为如何删书,那么这个过程实在复杂

如果考虑最后剩下的书,那么复杂度是\(2^n\)妥妥的\(T\)

但是仔细的想一下,会发现,考虑最后剩下的书时,并不是前面所有的状态都对现在的状态会有影响

即如果一本书隔得较远,则与你当前这本书没有多大关系,在保证所有的状态会被考虑在内的情况下,考虑状态压缩

设\(f[i][j][s][l]\)表示前\(i\)本书,删掉了\(j\)本,剩下书的种类的集合为\(s\),上一本没有被删的书的种类是\(l\)

考虑第\(i\)本书

  • 若删掉这本书,则有\(f[i][j+1][s][l]=min\left(f[i][j][s][l],]f[i-1][j][s][l]\right)\)
  • 若保留这本书,则有\(f[i][j][s|(1<<h[i])][h[i]]=min\left(f[i][j][s|(1<<h[i])][h[i]],f[i-1][j][s][l]+\left(h[i]==l?0:1\right)\right)\)

最后的时候回来考虑剩下的书的种类集合,如果原本所有书的种类集合\(S\)有一种书,现在没有了,那么我们就多减了一个1,加回来就是

\(\mathcal{Code}\)

/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年10月04日 星期五 08时36分03秒
*******************************/
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cstring>
#define inf 0x7f7f7f7f
using namespace std;
const int maxn = 111;
const int lim = 256;
//{{{cin
struct IO{
template<typename T>
IO & operator>>(T&res){
res=0;
bool flag=false;
char ch;
while((ch=getchar())>'9'||ch<'0') flag|=ch=='-';
while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
if (flag) res=~res+1;
return *this;
}
}cin;
//}}}
int n,k,cas;
int h[maxn],one[lim+5];
int f[2][maxn][lim+5][11];
bool now,pre;
//f[i][j][k][l] 前i本书选了j本书,存在的书的种类集合为k,上一本书为l
int main()
{
for (int i=0;i<lim;++i){
for (int j=0;j<8;++j)
if (i&(1<<j)) ++one[i];
}
while (true){
cin>>n>>k;
if (n+k==0) break;
int S=0,mh=0;
for (int i=1;i<=n;++i){
cin>>h[i];
h[i]-=25;
S|=1<<h[i];
mh=max(mh,h[i]);
}
++mh;
memset(f[0],0x7f,sizeof(f[0]));
now=0;
f[0][0][1<<h[1]][h[1]]=1;
f[0][1][0][mh]=0;
for (int i=2;i<=n;++i){
now^=1,pre=!now;
memset(f[now],0x7f,sizeof(f[now]));
for (int j=0;j<=k;++j){
for (int s=0;s<=S;++s)
for (int l=0;l<=mh;++l)
if (f[pre][j][s][l]!=inf){
f[now][j][s|(1<<h[i])][h[i]]=min(f[now][j][s|(1<<h[i])][h[i]],f[pre][j][s][l]+(h[i]==l?0:1));
f[now][j+1][s][l]=min(f[now][j+1][s][l],f[pre][j][s][l]);
}
}
}
int ans=inf;
for (int j=0;j<=k;++j)
for (int s=0;s<=S;++s)
for (int l=0;l<mh;++l)
if (f[now][j][s][l]!=inf){
int take=S^s;
ans=min(ans,f[now][j][s][l]+one[take]);
}
printf("Case %d: %d\n\n",++cas,ans);
}
return 0;
}

如有哪里讲得不是很明白或是有错误,欢迎指正

如您喜欢的话不妨点个赞收藏一下吧

P1777 帮助_NOI导刊2010提高(03)的更多相关文章

  1. 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告

    P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...

  2. 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

    P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...

  3. 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 ...

  4. P1771 方程的解_NOI导刊2010提高(01)

    P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...

  5. 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)

    [题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...

  6. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  7. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  8. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  9. P1794 装备运输_NOI导刊2010提高(04)

    P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ...

随机推荐

  1. receipt

    receipt - 必应词典 美[riˈsiːt]英[rɪ'siːt] n.收据:收入:接受:字据 v.开收据 网络收到:收条:发票 变形复数:receipts: 搭配give receipt:sig ...

  2. C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)

    转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多 ...

  3. 一个完整的类用来读取OpenSSL生成的pem格式的x509证书(C#)

    internal static class CcbRsaHelper { private const string Begin = "-----BEGIN "; private c ...

  4. 海思uboot启动流程详细分析(转)

    海思uboot启动流程详细分析(一) 海思uboot启动流程详细分析(二) 海思uboot启动流程详细分析(三)  

  5. Flutter响应式编程 - RxDart

    import 'package:flutter/material.dart'; import 'package:rxdart/rxdart.dart'; import 'dart:async'; cl ...

  6. 004-guava 集合-新增集合类型-MultiSet, MultiMap, BiMap , Table, ClassToInstanceMap, RangeSe, RangeMap等

    一.概述 Guava引入了很多JDK没有的.但明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契 ...

  7. Python3入门(十三)——连接数据库

    以Mysql为例: 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结 ...

  8. **209. Minimum Size Subarray Sum 长度最小的子数组

    1. 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nu ...

  9. 【Leetcode_easy】1170. Compare Strings by Frequency of the Smallest Character

    problem 1170. Compare Strings by Frequency of the Smallest Character 参考 1. Leetcode_easy_1170. Compa ...

  10. MockMvc 进行 controller层单元测试 事务自动回滚 完整实例

    package com.ieou.ms_backend.controller; import com.google.gson.Gson; import com.ieou.ms_backend.dto. ...