帮助:大毒瘤!!!调了我2h,拍了我2h,最后没调出来,重写才AC。wdnmd。

思路

这题主要是线性 dp ,而状压 dp 只是最后在统计答案时的一个辅助。

首先定义 \(dp[i][j][k]\) 为考虑前 \(i\) 本书,已经抽出来了 \(j\) 本,最后没被抽出来的一本书是高度 \(k\) 的最小混乱度。

每次放入的书与最后一位不同的时候我们把答案 \(+1\) 。

但是这样有一个弊端,就是当我们取出一些书后,还要放回去。我们自然是要放到那些没拿出来的同高度的书里面,但是如果一种高度的书全拿出来了,我们就必须加上那些全拿出来的书的种数。

观察到书本高度只能在 \([25,32]\) 这个区间里,有 \(8\) 种高度,所以我们考虑把所有书的高度 \(-25\) 后状压。

重新定义 \(dp[i][j][k][l]\) 表示考虑前 \(i\) 本书,已经抽出来 \(j\) 本,此时没被拿出来的书的状态为 \(k\) ,放在书架里的最后一本书的类型为 \(l\) 时的最小混乱度。

于是可以分两种情况转移:

  • 对于不把这本书拿出来的情况:
\[dp[i][j][k|(a[i])][a[i]]=\min(dp[i][j][k|(a[i])][a[i]],dp[i-1][j][k][l]+(a[i]!=l))
\]

这里 \(k|(a[i])\) 的原因是要把它放进去。后面 \((a[i]!=l)\) 的原因是如果高度不同,混乱度要 \(+1\) 。

  • 对于把这本书拿出来的情况:
\[dp[i][j+1][k][l]=\min(dp[i][j+1][k][l],dp[i-1][j][k][l])
\]

在 dp 完成之后,我们最后枚举后三维,并且让最终状态 \(((st \oplus p)\&p)\) ,就可以求出书架里少了哪些书,把少的书的个数加上即可,最后求个 \(\min\) 。注意提前预处理出每个二进制数 \(1\) 的个数减小常数。

最后观察到空间开销大,并且每次转移只会用到 \(i-1\) 里的数,所以考虑滚动数组优化 dp 。

同时注意提前把不合法的情况排除掉,可以减小部分常数。

代码

#include <bits/stdc++.h>
using namespace std;
int dp[2][105][260][15],a[105],pre[260],n,m,p,ans,now=0;
void solve()
{
ans=0x3f3f3f3f;
memset(dp,0x3f,sizeof(dp));
dp[0][0][0][8]=0;
for(int i=1;i<=n;i++)
{
int ni=(i&1),lst=(ni^1);
memset(dp[ni],0x3f,sizeof(dp[ni]));
for(int j=0;j<=m;j++)
{
for(int k=0;k<=p;k++)
{
for(int l=0;l<=8;l++)
{
if(dp[lst][j][k][l]>=(0x3f3f3f3f/2))continue;
dp[ni][j][(k|(1<<a[i]))][a[i]]=min(dp[ni][j][(k|(1<<a[i]))][a[i]],dp[lst][j][k][l]+(a[i]!=l));
dp[ni][j+1][k][l]=min(dp[ni][j+1][k][l],dp[lst][j][k][l]);
}
}
}
}
for(int i=0;i<=m;i++)
{
for(int j=0;j<=p;j++)
{
for(int k=0;k<=8;k++)
{
ans=min(ans,dp[(n&1)][i][j][k]+pre[(j^p)&p]);
}
}
}
printf("Case %d: %d\n\n",now,ans);
}
int main()
{
for(int i=0;i<(1<<8);i++)
{
for(int j=0;j<8;j++)
{
pre[i]+=((i>>j)&1);
}
}
while(1)
{
now++;
scanf("%d %d",&n,&m);
if(n==0&&m==0)break;
p=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]-=25;
p=(p|(1<<a[i]));
}
solve();
}
return 0;
}

Luogu P1777 帮助 题解 [ 紫 ] [ 线性 dp ] [ 状压 dp ]的更多相关文章

  1. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  2. 【Luogu】P1896互不侵犯King(状压DP)

    题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了…… 以后大家在做状压DP的时候一定要开long long…… 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...

  3. hdu 4352 "XHXJ's LIS"(数位DP+状压DP+LIS)

    传送门 参考博文: [1]:http://www.voidcn.com/article/p-ehojgauy-ot.html 题解: 将数字num字符串化: 求[L,R]区间最长上升子序列长度为 K ...

  4. 状态压缩dp 状压dp 详解

    说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...

  5. 洛谷 P3343 - [ZJOI2015]地震后的幻想乡(朴素状压 DP/状压 DP+微积分)

    题面传送门 鸽子 tzc 竟然来补题解了,奇迹奇迹( 神仙题 %%%%%%%%%%%% 解法 1: 首先一件很明显的事情是这个最小值可以通过类似 Kruskal 求最小生成树的方法求得.我们将所有边按 ...

  6. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  7. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  8. 51nod 1673 树有几多愁(链表维护树形DP+状压DP)

    题意 lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出 ...

  9. BZOJ3836 [Poi2014]Tourism 【树形dp +状压dp】

    题目链接 BZOJ3836 题解 显然这是个\(NP\)完全问题,此题的解决全仗任意两点间不存在节点数超过10的简单路径的性质 这意味着什么呢? \(dfs\)树深度不超过\(10\) \(10\)很 ...

  10. bzoj4455 & loj2091 [Zjoi2016]小星星 容斥原理+树形DP(+状压DP?)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...

随机推荐

  1. elasticsearch之python操作

    总结使用python对于elasticsearch的常用操作 安装 pip install elasticsearch 2. 连接 from elasticsearch import Elastics ...

  2. wps文字表格邮件附件部分图片无法预览的问题(1)

    使用邮箱客户端发送带word附件的邮件时,客户说部分图片无法查看.我方人员测试下,得到如下几点: 1.出问题的.docx文件下载后可以正常打开查看,但通过给自己邮箱转发邮件(包含附件),foxmail ...

  3. 使用nginx 压缩

    现在的程序使用单页面应用,因此程序会在一开始就会加载页面JS.如果带宽不够,那么会影响页面下载速度. 我们可以使用NGINX 进行压缩,加快文件下载. gzip on; gzip_min_length ...

  4. 前端每日一知之css常用布局单位

    脑图在线链接 本文内容依据[js每日一题]公众号精彩文章总结而来

  5. 服务拆分之《Dubbo服务跨云通信》

    2022年10月开始,公司从阿里请来的架构师将全力推进服务拆分这个计划.实际上这个计划早就提上日程了,只是没有一个带头大哥带着把这个事情搞起来,因为这个系统太庞大了,还非常的复杂,当时就没有哪一个人是 ...

  6. 为了改一行代码,我花了10多天时间,让性能提升了40多倍---Pascal架构GPU在vllm下的模型推理优化

    ChatGPT生成的文章摘要 这篇博客记录了作者在家中使用Pascal显卡运行大型模型时遇到的挑战和解决方案.随着本地大型模型性能的提升,作者选择使用vllm库进行推理.然而,作者遇到了多个技术难题, ...

  7. Redis应用—6.热key探测设计与实践

    大纲 1.热key引发的巨大风险 2.以往热key问题怎么解决 3.热key进内存后的优势 4.热key探测关键指标 5.热key探测框架JdHotkey的简介 6.热key探测框架JdHotkey的 ...

  8. 序列化与反序列化的概念、基于django原生编写5个接口、drf介绍和快速使用、cbv源码分析

    目录 一.序列化反序列化 二.基于django原生编写5个接口 三.drf介绍和快速使用 概念 安装 代码 四.cbv源码分析 一.序列化反序列化 api接口开发,最核心最常见的一个过程就是序列化,所 ...

  9. [转]C# Winform 跨线程更新UI控件常用方法汇总

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  10. Spring基础 02 | JdbcTemplate

    JdbcTemplate Spring对Jdbc的Api简单封装 开发步骤 1.导入Spring-jdbc.spring-tx坐标 2.创建数据库表和实例 3.创建jdbcTemplate对象 4.执 ...