hiho刷题日记——第八天状态压缩·一

【状压DP】状态压缩动态规划入门超详解 状压DP一、概述1.状态压缩2.使用条件3.状压DP二、位运算三、例题引入入门例题【例1】填满棋盘入门例题【例二】玉米地 感觉好多讲状压DP的博客都有点乱,我就结合各路大佬的博客,加上我自己的理解,总结出一篇博客来,供初学者参考 一、概述 1.状态压缩 状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的... 阅读详情

目录

第八周题目

时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述

小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市——那座城市即将举行美食节!

但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票——他们只能够乘坐最为破旧的火车进行他们的旅程。

不仅如此,因为美食节的吸引,许多人纷纷踏上了和小Hi小Ho一样的旅程,于是有相当多的人遭遇到了和小Hi小Ho一样的情况——这导致这辆车上的人非常非常的多,以至于都没有足够的位置能让每一个人都有地方坐下来。

小Hi和小Ho本着礼让他们的心情——当然还因为本来他们买的就是站票,老老实实的呆在两节车厢的结合处。他们本以为就能够这样安稳抵达目的地,但事与愿违,他们这节车厢的乘务员是一个强迫症,每隔一小会总是要清扫一次卫生,而时值深夜,大家都早已入睡,这种行为总是会惊醒一些人。而一旦相邻的一些乘客被惊醒了大多数的话,就会同乘务员吵起来,弄得大家都睡不好。

将这一切看在眼里的小Hi与小Ho决定利用他们的算法知识,来帮助这个有着强迫症的乘务员——在不与乘客吵起来的前提下尽可能多的清扫垃圾。

小Hi和小Ho所处的车厢可以被抽象成连成一列的N个位置,按顺序分别编号为1..N,每个位置上都有且仅有一名乘客在休息。同时每个位置上都有一些垃圾需要被清理,其中第i个位置的垃圾数量为Wi。乘务员可以选择其中一些位置进行清理,但是值得注意的是,一旦有编号连续的M个位置中有超过Q个的位置都在这一次清理中被选中的话(即这M个位置上的乘客有至少Q+1个被惊醒了),就会发生令人不愉快的口角。而小Hi和小Ho的任务是,计算选择哪些位置进行清理,在不发生口角的情况下,清扫尽可能多的垃圾。

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为三个正整数N、M和Q,意义如前文所述。

每组测试数据的第二行为N个整数,分别为W1到WN,代表每一个位置上的垃圾数目。

对于100%的数据,满足N<=1000, 2<=M<=10,1<=Q<=M, Wi<=100

输出

对于每组测试数据,输出一个整数Ans,表示在不发生口角的情况下,乘务员最多可以清扫的垃圾数目。

样例输入
5 2 1
36 9 80 69 85
样例输出
201

思路

由于要统计根据前面的状态来确定当前考虑的选项能不能选择。在动态规划的时候,需要传递的参数过多且不定。所以在这里需要对参数进行压缩。在这里因为题目要求比较简单,M<=10,所以可以直接用一个int(当然short也可以)来做状态的压缩。用1bit来表示这最近的M个选项的选择情况。0表示没选,1表示选了。这样便完成了状态的压缩。

代码

#include<cstdio>
#include<cstring>
using namespace std; 

int N,M,Q;
int a[1001];
int mem[1001][1050];

bool check(int n) //是否能选
{
    int count=0;
    n=n>>1;
    while(n)
    {
        count+= n%2;
        n=n>>1;
    }
    if(count<Q) return true;
    return false;
}

int f(int i,int n)
{
    if(mem[i][n]!=-1) return mem[i][n];
    if(i==N) return mem[i][n]=0;

    int t1,t2=0;
    t1=f(i+1,n>>1);  //int的后M位表示最近的M个选项的选择情况
    if(check(n)) 
    t2=f(i+1,n>>1 | 1<<(M-1))+a[i];
    return mem[i][n]=t1>t2?t1:t2 ;
} 
int main()
{
    memset(mem,-1,sizeof(mem));
    scanf("%d%d%d",&N,&M,&Q);
    for(int i=0;i<N;i++)
        scanf("%d",&a[i]);

    printf("%d",f(0,0));

    return 0;
}
【状压DP】易懂讲解状态压缩/状态压缩DP 本文是状态压缩DP的总结 阅读详情

相关推荐

一文讲通状态压缩算法

状态压缩 DP,看名字就让人头疼,很多人觉得这是些“天书”。但实际上,它的核心思想很简单——利用位运算来表示和操作问题的状态,直接用二进制的方式把状态“压缩”成一个整数。这个整数的每一位就代表了一个元素的状态(比如是否被选择、是否被访问等)。于是,我们就可以像操作整数那样,用高效的位操作来处理这些状态!想象一下,你有一个集合 {A, B, C, D},那么你可以用一个 4 位的二进制数1101来表示状态“选择了 A、C 和 D,没选 B”。这个时候,位运算就成了你的“魔法杖”!

qq_36916968的博客 1614

一文带你入门并吃透状态压缩DP

【本文比较适合有一定动态规划基础的童鞋阅读】 首先先讲讲什么是状态压缩 状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1 我们都知道二进制可以用来枚举子集,例如某个问题有8种情况,那么我们可以一个循环,从0到2^3-1,将所有情况枚举出来,这里拓展一个位运算的技巧(i>>j&1): 用来求十进制下的数i第j位是否为1,我们规定如果当前位为1就说明这一位应当被

m0_61714195的博客 3319

SWAT模型非点源模拟原理

目录引言模型概述非点源污染模拟原理物质迁移内容过程营养物农药病原菌运移河道水质模型营养元素的地表水体循环河道水质模拟藻类模拟氮元素磷元素生化需氧量及溶解氧重金属的运移蓄水体水质模拟 引言 今天无意接触到这一块,就记录下来了。 模型概述 1、流域中非点源污染的来源主要是农业化肥和农药的施用。 2、氮、磷等营养物和农药的迁移和转化取决于化合物在土壤环境中经历的转化过程。 3、SWAT模型可以模拟水文相应单元内氮、磷完整的营养物循环过程和任何一种农药的降解过程。 4、SWAT模拟流域内泥沙、藻类、溶解氧、有机污染

DoWayChan的博客 4877

动态规划——状态压缩dp

状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1;当然如果有三种状态用三进制来表示也未尝不可。棋盘类型的题目一般要求我们依照一定的约束条件,摆放棋子,一般问棋子的数量、摆放的方案数。。。

qq_57150526的博客 3890

《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?

Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。

897

LTSPICE使用教程:导入第三方库模型进行仿真

LTSPICE导入第三方SPICE模型进行仿真,以英飞凌的第三方.lib模型为实例进行详解

焊武大帝的专栏 3万+

状态压缩DP详细讲解

那么对于当前 k 位朋友分好零食得到的结果,等价于,已经将前 k 位小朋友分好零食,再将那 2 包零食分给第 k 位小朋友后得到的结果。,通常一个状态数据就是一个一串0和1组成的二进制数,每一位二进制数只有两种状态,比如说硬币的正反两面,10枚硬币的结果就可以用10位二进制数完全表示出来,每一个10位二进制数就表示了其中一种结果。位小朋友,为了让能拿到最多饼干的小朋友拿到尽可能少的饼干,可理解为缩小贫富差距,求所有可行的零食分发方案中最多饼干那位小朋友最少的一种,为多少。

曾续缘的博客 4244

基于DPLL算法解决3-SAT问题(C++实现)

近日看到一个3-SAT问题(Boolean SATisfiability Problem, 布尔逻辑可满足性问题),试着写了个算法求解。

qq_63241496的博客 2215

【算法·MEGA-17】动态规划-状态压缩DP

状态压缩动态规划(State Compression DP) 是一种优化动态规划算法的方法,特别适用于状态空间较大的问题。通过将状态信息压缩为较小的表示,减少内存占用并提高算法的效率。这种方法常用于求解某些状态空间是集合或者组合类型的问题,尤其是在状态较为复杂的情况下。状态压缩DP的核心思想是 将状态压缩成一个较小的数据结构,通常是通过二进制位表示来减少空间复杂度。状态空间较大时,直接存储所有状态的方案可能会占用大量内存,而通过压缩,可以减少内存占用。状态压缩DP常用于以下几类问题:问题描述:给定一组城市以

m0_69378371的博客 1898

PLC为西门子的S7-1200,舵机为 DS3218,PLC控制舵机旋转程序实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 998

【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等

本专栏研究领域为【超分辨率重建】,涵盖图像超分、视频超分,实时超分,4K修复等方面。主要内容包括主流算法模型的论文精读、论文复现、毕业设计、涨点手段、调参技巧、论文写作、应用落地等方面。算法模型从SRCNN开始更新至今,一般是一篇论文精读对应一篇论文复现。论文精读详解理论,归化繁为简,归纳核心,积累词句,培养阅读论文和论文写作能力。论文复现依托Pytorch代码,实现完整的模型训练流程,总结调参方法,记录碰到的bug,论文插图可视化,培养读写代码能力、做实验的能力、以及应用落地能力。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 3万+

状态压缩DP 图文详解(一)

超详细的讲解,有图有真相的状压DP真的不来看看吗?

m0_64226820的博客 2万+

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

Indigo Furry mix 是一个混合模型,出的图具有雄性人类的体型和野兽的形态。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者indigowing文件名称文件大小1.99GB。

水滴的博客 1830

算法:状态压缩dp

状态压缩dp实际上比其他dp要容易想一点,因为状态很容易定义,并且使用状压那么数据就必须很小比如int32位,longlong64位,数据大小最多那么大。是一种在解决某些特定类型的问题时非常有效的技术,特别是在涉及到限制状态或配置数量较多,但可以用整数或位操作来紧凑表示的情况。这种方法通常用于解决优化问题,特别是在图论、搜索问题、排列组合问题中非常常见,如旅行商问题(TSP)、位掩码问题等。状态压缩DP的核心思想是使用整数的二进制表示来表示复杂的状态集合。每一个比特位可以代表一个元素的某种状态(通常是存在或

m0_63997099的博客 2637

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

状态压缩动态规划1:基本状态压缩

集合运算,位运算和基本状压DP的讲解

Ternence_Tao的博客 1120

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

状态压缩dp

、状态压缩dp就是,当你发现一个问题他在一个非常小的网格里摆放着稀奇古怪的玩意,它的数据范围非常小,你一眼dfs 的时候,突然发现答案过大,直接枚举会T,甚至需要取模,抑或是在一个相邻的区间最多能有几天可以进行k次操作,询问你答案,你却一筹莫展的时候,你想到了它。 但可以肯定的是,你有办法得到问题的答案。借助于二进制,借助于位运算,你把状态压缩成了二进制数,借助奇怪的位运算转移,然后你就成功了。 接下来让我们来看例题: 327. 玉米田 农夫约翰的土地由 M×N个小方格组成,现在他要在土地里种植

weixin_61819021的博客 2560

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

DP-状态压缩DP(解释+典例)

1、什么是状态压缩DP 状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1;当然如果有三种状态用三进制来表示也未尝不可。 状态压缩DP:顾名思义,就是用状态压缩实现DP 2、经典问题 状态压缩最经典的问题应该就是旅行商问题了 (1)问题描述:旅行推销员问题(英语:Travel...

weixin_44254608的博客 5784

动态规划进阶(八):状态压缩DP详解

状态压缩动态规划(State Compression DP)是一种利用位运算优化状态存储的DP实现技术。通过将多维状态压缩为整数的二进制位表示,可以显著减少空间复杂度,特别适用于处理包含大量状态但状态之间存在强关联性的问题。:当前已访问城市状态为state,最后停留在城市u的最短路径// 其中 prev_state = state ^ (1 << u)掌握核心思想:将状态信息编码为整数熟练位运算:灵活使用与、或、异或等操作问题建模能力:将实际问题转化为状态转移模型空间优化意识。

xiaoyu❅的博客 1720

算法: 状态压缩DP

文章目录什么是状态压缩DP常用位运算例题一: 旅行商问题例题二:Traveling by Stagecoach(Poj 2686) 什么是状态压缩DP DP,即动态规划,传统的动态规划都是基于整数的, 比如背包问题。定义状态dp[i][j]dp[i][j]dp[i][j]:背包容量为jjj时前iii件物品的最大收益。这里iii取整数。而对于状态压缩型的DP:动态规划是基于集合的,但是我们使用二进制...

Wangpeiyi9979的博客 1302

状态压缩DP学习总结+经典例题精解

文章目录状压DP学习总结+经典例题精解1、前言2、状态压缩3、使用场景4、常用模板5、经典例题[5.1、 [USACO06NOV]Corn Fields G](https://www.luogu.com.cn/problem/P1879)5.2、吃奶酪[5.3、 [USACO13NOV]No Change G](https://www.luogu.com.cn/problem/P3092)5.4、[SCOI2005]互不侵犯 状压DP学习总结+经典例题精解 1、前言 学了这么久,说真的,动态规划是一个特别

pursuit的博客 1万+

3.26总结(状态压缩)

状态压缩就是使用某种方法,简明扼要的以最小代价来表示某种状态,通常使用01这种二进制数字来表示各个点的状态,这就要求使用状态压缩的点只有两种状态,比如棋盘上某个点是否放置了旗子,其只有两种状态,放了或者没放。当然了,如果有三种状态就是三进制,四种状态就是四进制,(一般来说最多就是三进制了)状态压缩分为两类:1.连通性dp(棋盘式)2.集合式dp(表示每一个元素是否在一个集合中)本博客主要讲述第一种连通性dp。

2301_80475191的博客 1324

状态压缩DP

状态压缩问题入门

信息学奥赛学案 565

状态压缩动态规划——状压dp

状压dp:意思是将状态进行压缩,从而更容易地写出状态转移方程通常做法:将每个状态(一个集合)用二进制表示,每个位的1就代表着这个编号的元素存在,0就代表着这个编号的元素不存在,如二进制100110,即是集合{1,2,5}的压缩通过状态压缩,我们可以使得状态通过位运算来判断是否可以转移。

Se_ren_di_pity的博客 2633

动态规划(5)状态压缩dp

简单状压dp

weixin_64197656的博客 749

什么是状态压缩DP???

如何进行DP状态定义,这是我们首要解决的DP问题,无非就是从小问题递推到大问题,那么我们可以这样进行dp定义::代表在S集合内,到达j点的最短距离(j也在S集合内,因为每个点都需要到达)我们可以通过子集然后递推求出大集合这道题很明确,其实就是求最小值,也就是。

xiao_a_lian的博客 1249
上一篇: hiho刷题日记——第七天完全背包
下一篇: hiho刷题日记——第九天状态压缩·二
昂村饭
博客等级 码龄12年 5粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值