题目描述

这个题是想介绍状态压缩。

其实这题的状态压缩并不难,因为需要记录的只是前面位置是否清扫,也即只有0、1两种状态,故使用一个bit位来记录一个位置。

但是这题跟之前做的动归不同的地方是:

之前的题目状态转移方程是f[i, j]可以由以前的状态算出;

这个题状态转移方程是f[i, j]可以推出以后的几个状态的值。

因此这题就需要将当前状态可以导致的所有以后的状态都进行更新。

状态 f[i, j] 表示已经处理到第 i 个位置,j 的二进制形式记录了当前位置 i 前 m – 1 个位置(包括 i )的清扫情况,最低有效位表示当前位置的前第 m – 1 个位置是否清扫,最高有效位表示当前位置是否清扫情况。

转移方程 f[i, j] 可以转移到 f[i + 1, j >> 1],即第 i + 1 位置不清扫;若 j 的二进制表示中 1 的个数小于q,则还可以转移至状态 f[i + 1, (j >> 1) | (1 << (m - 2))],即清扫第 i + 1 位置。

结果的状态表示是:max(f[n, k]) for all valid k。

由于 f[i + 1, j] 只由 f[i, k] 决定,使用滚动数组进行空间压缩。

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;int w[1005];
int f[2][1<<9];int bits_cnt(int k) {int rst = 0;while (k) {rst += (k & 1);k >>= 1;}return rst;
}int main() {int n, m, q;cin >> n >> m >> q;for (int i = 1; i <= n; i++) {cin >> w[i];}memset(f, -1, sizeof(f));f[1][0] = 0;f[1][1 << (m - 2)] = w[1];int rst = 0;for (int i = 1; i < n; i++) {for (int j = 0; j < (1 << (m - 1)); j++) {if (f[i & 1][j] >= 0) {int cnt = bits_cnt(j);if (cnt < q) {int t = max(f[(i + 1) & 1][(j >> 1) | (1 << (m - 2))], f[i & 1][j] + w[i + 1]);f[(i + 1) & 1][(j >> 1) + (1 << (m - 2))] = t;rst = max(rst, t);f[(i + 1) & 1][j >> 1] = max(f[(i + 1) & 1][j >> 1], f[i & 1][j]);}else if (cnt == q) {f[(i + 1) & 1][j >> 1] = max(f[(i + 1) & 1][j >> 1], f[i & 1][j]);}}}}cout << rst << endl;return 0;
}

吐槽:

“因此这题就需要将当前状态可以导致的所有以后的状态都进行更新。”

转载于:https://www.cnblogs.com/xblade/p/4466974.html

[hiho 08]状态压缩相关推荐

  1. hiho #1044 : 状态压缩·一

    描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票-- ...

  2. [hiho 09]状态压缩

    题目描述 sum[i, j, s] 表示第 i 行第 j 个位置以前(第1到第 i 行,第 i 行第1列到第 j – 1 列)已经全部填满,在状态s的约束下要填满剩余位置的可行方案数.s 是压缩表示的 ...

  3. HDU 1565 状态压缩

    题意: 你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大.(n <= 20 ...

  4. [状态压缩DP] COJ 1129 送货到家

    第一道状态压缩DP: 这道题要求一个无向图的最小权回路,要求经过所有点,所以可以任选一个点(这里选0)作为起点,以后的状态f[s, i]表示从0出发到i结束的最小权路径,最终求得f[1<< ...

  5. HDU4026 Unlock the Cell Phone [状态压缩DP]

    一开始看范围特别小就写搜索了...结果自己随便出了个4*4就过不了了.. 其实就是状态压缩DP,求哈密顿回路要多少条,只是要注意判断两点是否可以划线就可以了. #include <stdio.h ...

  6. pat 食物链(状态压缩求哈密顿回路)

    状态压缩求哈密顿回路 #include<bits/stdc++.h> using namespace std; bool dp[23][1<<21]; char s[22][2 ...

  7. POJ-1753 Flip Game 枚举 状态压缩

    刚开始做这题时总是在想应该用何种的策略来进行翻装,最后还是没有想出来--- 这题过的代码的思路是用在考虑到每个点被翻装的次数只有0次或者是1次,所以对于16个点就只有2^16中请况了.再运用位运算将状 ...

  8. 状压DP Hiho-1044 状态压缩

    状态压缩 [HihoCoder - 1044] 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小 ...

  9. POJ-1185 炮兵阵地 动态规划+状态压缩

    由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态 ...

最新文章

  1. 自主数据类型:在TVM中启用自定义数据类型探索
  2. 阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力
  3. OSPF中stub area配置实例
  4. 学生系统优化(二)- - 窗体代码
  5. linux下mysql服务架设_linux下源码搭建php环境之mysql(一)
  6. P1352 没有上司的舞会
  7. Linux下c/c++项目代码覆盖率的产生方法
  8. Flutter实战视频-移动电商-45.详细页_说明区域UI编写
  9. 从java进程里dump出类的class文件的小工具--dumpclass
  10. 大数据(2)---Hadoop由哪几部分组成?
  11. 【转】C#的内存管理:堆栈、托管堆与指针
  12. seo关键词互点软件报价_舟山seo关键词优化软件
  13. git学习(二)查看log历史记录
  14. CSS篇 Process Document第7章 Technical Report Development Process翻译
  15. 必看干货!五个步骤帮您成功实施IT SLA
  16. 第五人格为什么服务器维护中,《第五人格》提前停服原因和不删档测试说明
  17. 百度地图根据经纬度获取实际地理位置Api接口
  18. 非对称加密-区块链核心技术之一
  19. Intel Realsense D455 D435i D415 T265 3D实感硬件对比
  20. 地图坐标概念 html,普通地图坐标

热门文章

  1. 17.letterCombinations
  2. Doris之Insert Into
  3. Fielding博士论文导读----第6章 1
  4. ie7,ie8背景图片background-size无效问题
  5. 2018年12月云栖技术活动最全资料汇总:50+直播与Meetup分享...
  6. 【一步一个脚印】从零开始搭建SSM框架-- 1.1 配置JDK
  7. java使用Thumbnails压缩图片
  8. Python学习日记(四) 集合和元祖
  9. [VS2019 C#] 写一个PC上位机
  10. {shape\*mergeformat}的解决办法