题面

我们直接通过一个例题来了解子集 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相关推荐

  1. 【训练题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 ...

  2. HDU 4336 Card Collector(状压 + 概率DP 期望)题解

    题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...

  3. Codeforces ----- Kefa and Dishes [状压dp]

    题目传送门:580D 题目大意:给你n道菜以及每道菜一个权值,k个条件,即第y道菜在第x道后马上吃有z的附加值,求从中取m道菜的最大权值 看到这道题,我们会想到去枚举,但是很显然这是会超时的,再一看数 ...

  4. ACM-ICPC 2018 南京赛区网络预赛 E.AC Challenge 状压dp

    题意: 给定n个作业,每个作业有两个值a,b, 第i天完成这个作业会得到value :i*a + b: 但是完成这个任务之前需要完成一些别的任务 思路: 乍一看像是搜索,但是似乎不太行(好像可以写过) ...

  5. ACM-ICPC 2018 南京赛区网络预赛丨AC Challenge丨状压DP

    题意: 一个人做n道题目,每道题会收获ai*t+bi的分数,同时要休息一个单位的时间t.此外,还限制做题目i之前,要先完成si道题目{pi1,pi2,···,pisi}求最多获得多少分数. 思路: n ...

  6. Codeforces 1741G 最短路上状压dp

    题意: 有 n n n个地方,他们被 m m m条道路相连.有一天, t o t tot tot个人在 1 1 1处开派对,开完派对他们要回家,他们回家只会走最短路径,其中有 k ( k ≤ 6 ) ...

  7. CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)

    柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  8. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  9. UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举

    题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...

  10. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

最新文章

  1. 简单介绍SQL中ISNULL函数使用方法
  2. php安装gb,php安装程序的原理
  3. 如何挂载阿里云Linux服务器的“数据盘”(新购买)
  4. 计算机科学竞赛加拿大,滑铁卢大学计算机科学与数学竞赛最新考试时间!
  5. matlab最小生成树举例,Matlab最小生成树示例
  6. (3)<meta>标签
  7. php操作xml类,PHP实现的XML操作类【XML Library】
  8. html5的q标签,HTML 5 q 标签 - HTML 参考手册
  9. WARNING:root:could not open file ‘/etc/apt/sources.list.d
  10. TigerGraph入门
  11. 大楼通信综合布线系统_详解综合布线系统
  12. 旧版的rust怎么老是掉线_RUST服务器进不去 RUST掉线用什么加速器解决?
  13. 浅谈数据指标以及指标体系
  14. python123新版个人所得税计算请输入正数_Python训练的数字组合,个人所得税计算,完全平方数,python,之...
  15. 大国的崛起:第二集:小国大业 荷兰
  16. 杭州网侠大会及JavaEye会员聚会照片
  17. 机器学习分类算法之XGBoost(集成学习算法)
  18. MTK Android Driver :Camera
  19. 网易我的世界服务器正在维护,网易《我的世界》Hypixel中国版服务器将停止运营...
  20. 壕!程序员摆25台iPhone X求婚 闺蜜1人1台

热门文章

  1. Web前端开发 -- HTML基础(2)
  2. Mac数据库可视化工具,workbench完全替代Navicat和PowerDesigner,Oracle官方免费可视化工具workbench!!
  3. Android主板串口线接法,9针rs232串口接线图以及接线方法
  4. mysql 数据恢复 (.ibdata1, bin log)
  5. Xshell是做什么用的?Xshell使用教程分享
  6. 某公司基于FineBI数据决策平台的试运行分析报告
  7. 想多赚钱!程序员如何把副业搞得风生水起?
  8. 智慧城市大数据分析系统解决方案
  9. jmeter 连接mysql数据库
  10. 用java将excel文档格式的标日初单词转成适合有道单词本的xml格式