hihocoder-第八周-dp状态压缩

【状压DP】易懂讲解状态压缩/状态压缩DP 本文是状态压缩DP的总结 阅读详情
时间限制: 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
    题目来源--hihocoderhttp://hihocoder.com/problemset/problem/1044   解析在题目里的提示里, 讲解的很清楚
#include <iostream>
using namespace std;


int dp[1001][1025];
int w[1001];


int countDigit( int s) //统计坐了多少个位
{
    int digit = 0;
    while( s){
        if( s&1) digit++;
        s >>= 1;
    }
    return digit;
}


int main()
{
    int N, M, Q;


    cin >> N >> M >> Q;


    for( int i = 1; i <= N; i++)
        cin >> w[i];




    for( int i = 1; i <= N; i++)
    for( int s = 0; s < ((1<<M)-1); s++){
        if( countDigit(s) > Q) { dp[i][s] = 0; continue;}  
        if( countDigit(s) < Q)
            dp[i][s] = max( dp[i-1][s/2], dp[i-1][s/2+(1<<(M-2))]);
        else dp[i][s] = dp[i-1][s/2];
        if( s&1) dp[i][s] += w[i];
    }


     int ans = 0;
     for( int s = 0; s < ((1<<M)-1); s++)
         ans = max( ans, dp[N][s]);


     cout << ans << endl;
     
     return 0;


}





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

相关推荐

matsim教程及其案例

MATSim 是一个强大的交通仿真工具,适合研究交通政策、出行行为优化和城市规划。建议从官方示例入手,逐步尝试修改参数和扩展功能。遇到问题时,优先查阅官方文档和社区讨论。(Multi-Agent Transport Simulation Toolkit)的教程和案例资源整理,涵盖基础入门、核心概念、实际应用案例及学习路径。MATSim 是一个开源的、基于多智能体的交通仿真框架,用于模拟城市交通系统中的出行行为、交通流量和交通政策影响。

weixin_70682362的博客 1094

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

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

m0_61714195的博客 3319

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6575

动态规划——状态压缩dp

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

qq_57150526的博客 3890

【联邦学习】联邦平均(FedAvg)_附pytorch代码实现

其他代码包括1)数据集划分;2)训练;3)保存结果;4)绘图都可在 https://github.com/kt4ngw/fedavg-pytorch 找到。如果您对文章有建议及指定,也欢迎您留言评论,作者定当虚心修正。

kt4ngw的博客 5111

Multisim仿真运放积分器踩坑实录:为什么你的方波变不成三角波?

本文针对Multisim仿真运放积分器时方波无法转换为三角波的常见问题,提供了详细的排查与调试指南。文章指出,经典RC积分电路因直流反馈开路导致运放饱和,核心解决方案是在反馈电容两端并联大阻值电阻以稳定直流工作点。通过参数优化(调整Rin、C、Rf)和高级仿真技巧,手把手教你调出线性度好、幅度适中的完美三角波,并分享异常波形(如饱和、不对称、振荡)的对应策略。

weixin_29231263的博客 114

状态压缩DP详细讲解

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

曾续缘的博客 4244

AltiumDesigner 高效封装库管理 -- samacsys插件实战指南

本文详细介绍了如何利用samacsys插件高效管理AltiumDesigner封装库。通过实战指南,指导用户完成插件安装、云端元件搜索与放置,并分享将海量资源整合为个人标准库的管理策略,从而大幅提升PCB设计效率与可靠性,杜绝封装错误。

weixin_28285943的博客 125

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

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

m0_69378371的博客 1901

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 570

BepInEx插件开发实战:用Visual Studio快速创建你的第一个Unity Mod(2024新版)

本文是2024年新版BepInEx插件开发实战指南,详细讲解如何使用Visual Studio快速创建你的第一个Unity Mod。内容涵盖专业开发环境搭建、插件生命周期解析、利用HarmonyX进行游戏代码注入、实现实时调试与热重载技巧,以及项目配置与打包发布全流程,助你从Mod使用者转变为创造者。

weixin_29002595的博客 340

算法:状态压缩dp

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

m0_63997099的博客 2637

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2078

状态压缩dp

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

weixin_61819021的博客 2561

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

weixin_44254608的博客 5784

OV9734 DATASHEET,完整规格书

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

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

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

xiaoyu❅的博客 1720

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

算法: 状态压缩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

状态压缩问题入门

信息学奥赛学案 565

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

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

Se_ren_di_pity的博客 2633

状态压缩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万+

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

简单状压dp

weixin_64197656的博客 749

什么是状态压缩DP???

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

xiao_a_lian的博客 1249

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

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

m0_64226820的博客 2万+

状压Dp

入门题是一个摆棋盘得问题,n * m得棋盘中可以摆放1 * 2 和 2 * 1 得棋子,问你摆满有几种摆放得可能,比较特得是n得范围特别小,m得范围大一些,这就是一个标志,可以向状态压缩上靠拢。首先得寻找一个状态,这个状态的值就只有0和1——可以用二进制来表示,就是2^n,所以这也是为什么n得范围会很小的原因了,我们可以遍历每一列,然后取舍当前列的摆放,用0001001表示对下一列得影响(横着放的...

Df_cjc的博客 365

状态压缩DP总结【POJ3254】【POJ1185】【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】

动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了。难点在于以下几个方面:状态怎么压缩?压缩后怎么表示?怎么转移?是否具有最优子结构?是否满足后效性?涉及到一些位运算的操

我叫MK 3万+
上一篇: hihocoder-第九周-状态压缩二
下一篇: hihocoder-第十一周 树中的最长路
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值