问题简介

详情请参考hihocoder官网。从N个数字选取任意个数字使得数字和最大,需要满足连续M个数字中不选择超过Q个。

算法详解

这个问题可以利用动态规划求解,需要按数字枚举,且对于前M个是否选取的状态展开。时间复杂度为O(N*2^M),因为M不大于10,所以O(2^M)=O(1024)=O(1)。
具体的对于第i个数字,存储i-M+1到i这M个数字的2^M种选取情况下,从前i个数字中进行满足条件的选取可以得到的最大值。
问题在于状态是动态且不定的,所以需要对状态进行压缩。具体的,用一个数字即可表示所有的状态,从个位起第k个bit表示第i-k+1个数字是否选取,选取则为1,否则为0.
这样得到的转移方程即为
  • f[i][j] = 0 if cnt[j] > Q
  • f[i][j] = max(f[i-1][j>>1+1<<(M-1)],f[i-1][j>>1])+weight[j]; if j&1==1
  • f[i][j] = max(f[i-1][j>>1+1<<(M-1)],f[i-1][j>>1]); if j&1==0

其中cnt[j]表示j中有多少个1。

代码

#include <iostream>using namespace std;void build_cnt(int *cnt,int m){int len = 1<<m;for (int i = 0;i < len;++i){cnt[i] = 0;for (int j = 0;j < m;++j)cnt[i] += ((i>>j)&1);}
}inline int mmax(int a,int b){return (a>b)?a:b;
}int main()
{int n,m,q;int weight[1002] = {0};cin >> n >> m >> q;for (int i = 0;i < n;++i)cin >> weight[i];int maxw[2][2050] = {0};int cnt[2050];bool flag = true;int len = 1<<(m);build_cnt(cnt,m);//    cout << "cnt: ";
//    for (int i = 0;i < len;++i)
//        cout << cnt[i] << ' ';
//    cout << endl;for (int i = 0;i < n;++i){for (int j = 0;j < len;++j){if (cnt[j] > q)maxw[flag][j] = 0;else {if (j&1){maxw[flag][j] = mmax(maxw[!flag][(j>>1)+(1<<(m-1))],maxw[!flag][(j>>1)])+weight[i];}else {maxw[flag][j] = mmax(maxw[!flag][(j>>1)+(1<<(m-1))],maxw[!flag][(j>>1)]);}}}
//
//        cout << i << ": ";
//        for (int j = 0;j < len;++j)
//            cout << maxw[flag][j] << ' ';
//        cout << endl;flag = !flag;}int result = 0;for (int i = 0;i < len;++i){if (result < maxw[!flag][i])result = maxw[!flag][i];}cout << result << endl;return 0;
}

[hihocoder1044]状态压缩一相关推荐

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

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

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

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

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

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

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

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

  5. 树上启动式合并问题 ---- D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [状态压缩+树上启发式合并]

    题目链接 题目大意: 一棵根为1 的树,每条边上有一个字符(a−va−va−v共22种). 一条简单路径被称为Dokhtar−kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树 ...

  6. 点分治问题 ----------- HDU 5977 or 2016年大连ICPC [点分治+状态压缩]

    题目链接 题目大意: 就是给你一颗树,树上有各种权值,权值只有K种k∈[1,10]K种k\in[1,10]K种k∈[1,10],问你有多少路径覆盖了这KKK种权值,n∈[1,5e4]n\in[1,5e ...

  7. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  8. 解题报告(一)D、(CROC 2016 - Final Round C)Binary Table(矩阵 + 状态压缩 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 【动态规划】状态压缩动态规划

    整理的算法模板合集: ACM模板 目录 一.集合类状态压缩动态规划 A. AcWing 91. 最短Hamilton路径 B.AcWing 524. 愤怒的小鸟 二.连通类(棋盘类)状态压缩动态规划 ...

最新文章

  1. 0x00000000指令引用的内存不能为written_jvm的内存结构
  2. opencv cuda使用笔记
  3. APP元素获取信息操作API
  4. c++从字符串中提取数字求和_【函数应用】单元格文本内提取数字并求和
  5. 创建win32 dll
  6. java 仿qq登录界面7.1_安卓开发学习笔记(七):仿写腾讯QQ登录注册界面
  7. Flutter学习之纵向布局
  8. javascript在asp.net中运用
  9. Java和web前端,IT新人该如何选择?
  10. 留言板删除功能mysql_用PHP写留言板代码时怎样才能实现删除和修改留言的啊?代码是怎样的?...
  11. 关于dotnetbar控件
  12. 小川用的Ubuntu软件和库
  13. 陈越微博c语言自学攻略,数据结构自学攻略
  14. 【编程题】【Scratch四级】2021.09 小猫钓鱼
  15. 有什么好用的表单工具?
  16. [Power Query] 数据类型转换
  17. 如何查看内核版本和ubuntu版本
  18. 大数据三个特点的理解
  19. (时间篇)关于时间的思考
  20. 因计算机丢失d3dx9-30,win10 64位纯净版运行仙剑5提示缺少d3dx9_30.dll的修复方法

热门文章

  1. elementui 分页与tabe数据绑定
  2. 【华为OD统一考试B卷 | 200分】宜居星球改造计划(Java JavaScript Python)
  3. 涡轮发动机图测试线2010开关测试机SW辊子输送机用抓手SW双头精雕机IGSFPC折弯设备、FPC软板折弯机SWZ4直流电机_三维图Z4-112-4-1_5.5KW_160-1抛光机三维图
  4. 为什么相爱的人不能在一起?
  5. 半路出家自学Python,几个月的努力,终于拿到一份月薪上万offer
  6. 内存管理<原理篇>(五、页表和快表)
  7. odoo的many2many和one2many字段给默认值
  8. Flask web开发实战之基础篇 初识Flask
  9. webp格式一键转图片小工具一拖即转格式可选路径可选(源码)
  10. 神经网络中的概率分布函数