状压DP——子集DP
题面
我们直接通过一个例题来了解子集 DP,子集 DP 属于状压 DP 的一种。
给定一个长度不超过 n 的字符串 s,如果 s 中的一个子序列是回文,那么我们就可以从 s 中移除这个子序列,求最少经过多少步我们可以移除整个字符串 s。如:我们可以从"dqewfretd"中移除 “defed”,剩下的字符串即:“qwrt”。
题目解析
使用状压DP进行求解:
对于状态i,用dp[i]dp[i]dp[i]表示最少的操作次数
当状态i
对应的子序列是回文时,dp[i]=1
对于状态i的一个子状态t,如果t也是回文序列,那么
dp[i]=min(dp[i],dp[i⊕t]+1)dp[i]=min(dp[i],dp[i⊕t]+1)dp[i]=min(dp[i],dp[i⊕t]+1)
O(4n+n×2n)\mathcal{O}(4^n + n\times 2^n)O(4n+n×2n)
子集 dp 有一个巧妙的写法,把时间复杂度压缩到O(3n+n×2n)O(3^n + n\times 2^n)O(3n+n×2n)一般来说 3n3^n3n会远大于 n×2n,所以子集dp的复杂度用n\times 2^n,所以子集 dp 的复杂度用n×2n,所以子集dp的复杂度用 O(3^n)$
for (int i = 1; i < (1 << n); i++) {dp[i] = IsPalindrome(i) ? 1 : inf; // 判断当前状态是否是回文,如果是回文则步骤数为 1for (int t = i; t; t = (t - 1) & i) {dp[i] = min(dp[i], dp[t] + dp[i ^ t]);}
}
cout << dp[(1 << n) - 1] << endl;
通过
for (int t = i; t; t = (t - 1) & i)
这个方式我们可以快速枚举一个状态的所有子集。
示例代码
#include <iostream>
#include <string>
using namespace std;
int dp[1 << 16];
int n;
string str;
bool IsPalindrome(int x){string ss="";int cnt=0;for(int i=0;i<n;i++){if(x&(1<<i)){ss+=str[i];cnt++;}}for(int i=0,j=cnt-1;i<j;i++,j--){if(ss[i]!=ss[j]){return false;}}return true;
}
int main() {cin >> n;cin >> str;for(int i=1;i<(1<<n);i++){dp[i]=IsPalindrome(i) ? 1 : n;for(int t=i;t;t=(t-1)&i){dp[i]=min(dp[i],dp[t]+dp[i^t]);}}cout<<dp[(1<<n)-1]<<endl;return 0;
}
状压DP——子集DP相关推荐
- 【训练题66:状压暴力 | 子集dp】Greater Integer, Better LCM | 2021牛客暑期多校训练营5
题意 Greater Integer, Better LCM | 2021牛客暑期多校训练营5 给你 a,b,ca,b,ca,b,c ,你需要找到一对 x,yx,yx,y ,满足: lcm(a+x,b ...
- HDU 4336 Card Collector(状压 + 概率DP 期望)题解
题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...
- Codeforces ----- Kefa and Dishes [状压dp]
题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...
- ACM-ICPC 2018 南京赛区网络预赛 E.AC Challenge 状压dp
题意: 给定n个作业,每个作业有两个值a,b, 第i天完成这个作业会得到value :i*a + b: 但是完成这个任务之前需要完成一些别的任务 思路: 乍一看像是搜索,但是似乎不太行(好像可以写过) ...
- ACM-ICPC 2018 南京赛区网络预赛丨AC Challenge丨状压DP
题意: 一个人做n道题目,每道题会收获ai*t+bi的分数,同时要休息一个单位的时间t.此外,还限制做题目i之前,要先完成si道题目{pi1,pi2,···,pisi}求最多获得多少分数. 思路: n ...
- Codeforces 1741G 最短路上状压dp
题意: 有 n n n个地方,他们被 m m m条道路相连.有一天, t o t tot tot个人在 1 1 1处开派对,开完派对他们要回家,他们回家只会走最短路径,其中有 k ( k ≤ 6 ) ...
- CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)
柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举
题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
最新文章
- 简单介绍SQL中ISNULL函数使用方法
- php安装gb,php安装程序的原理
- 如何挂载阿里云Linux服务器的“数据盘”(新购买)
- 计算机科学竞赛加拿大,滑铁卢大学计算机科学与数学竞赛最新考试时间!
- matlab最小生成树举例,Matlab最小生成树示例
- (3)<meta>标签
- php操作xml类,PHP实现的XML操作类【XML Library】
- html5的q标签,HTML 5 q 标签 - HTML 参考手册
- WARNING:root:could not open file ‘/etc/apt/sources.list.d
- TigerGraph入门
- 大楼通信综合布线系统_详解综合布线系统
- 旧版的rust怎么老是掉线_RUST服务器进不去 RUST掉线用什么加速器解决?
- 浅谈数据指标以及指标体系
- python123新版个人所得税计算请输入正数_Python训练的数字组合,个人所得税计算,完全平方数,python,之...
- 大国的崛起:第二集:小国大业 荷兰
- 杭州网侠大会及JavaEye会员聚会照片
- 机器学习分类算法之XGBoost(集成学习算法)
- MTK Android Driver :Camera
- 网易我的世界服务器正在维护,网易《我的世界》Hypixel中国版服务器将停止运营...
- 壕!程序员摆25台iPhone X求婚 闺蜜1人1台
热门文章
- Web前端开发 -- HTML基础(2)
- Mac数据库可视化工具,workbench完全替代Navicat和PowerDesigner,Oracle官方免费可视化工具workbench!!
- Android主板串口线接法,9针rs232串口接线图以及接线方法
- mysql 数据恢复 (.ibdata1, bin log)
- Xshell是做什么用的?Xshell使用教程分享
- 某公司基于FineBI数据决策平台的试运行分析报告
- 想多赚钱!程序员如何把副业搞得风生水起?
- 智慧城市大数据分析系统解决方案
- jmeter 连接mysql数据库
- 用java将excel文档格式的标日初单词转成适合有道单词本的xml格式