当前位置:网站首页>简单易懂的子集dp
简单易懂的子集dp
2022-04-23 06:21:00 【Zimba_】
前置知识:
状压:
用二进制(或n进制)代表的十进制数来表示状态,通过位操作进行状态调整。
举个例子,房间内4盏灯的亮灭情况为0101,该状态存储下的十进制数为5。

从右往左编号为0,1,2,3。打开第3盏灯即将原状态5变为5|(1<<3)。
关于状压只做简单介绍。
枚举二进制子集:
二进制数为s,枚举其子集的含义是指,枚举所有x∈{x| x|s=s}。
具体操作如下:
for (int i = s; i; i = (i - 1) &s)
这样就可以精确地枚举s的二进制子集,注意此时循环体中子集不包含0(空集),如要添加,需手动设置循环条件。
正文:
概述:
顾名思义,子集dp的状态转移,通常是由子集转移至当前集合,而有了枚举二进制子集的枚举方法之后,代码写起来会非常舒服,可以拥有更优秀的复杂度。
框架:
用转移方程dp[S]=dp[S⊕T]+max(dp[T]),T⊆S且T≠Ø为例,其中S⊕T含义是T关于S的补集,大体框架如下。
for(int i=0;i<1<<n;i++)
{
for(int j=S&(S-1);j;S&(j-1))
{
dp[S]=max(dp[S],dp[S^j]+dp[j]);
}
}
复杂度证明:
枚举所有集合的子集。
∑ i = 0 n ( n i ) 2 i = 3 n \sum_{i=0}^{n}\binom{n}{i}2^{i}= 3^{n} ∑i=0n(in)2i=3n
也就是o(3n)。
例题(牛客练习赛49B):
问题简述:就是这样
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
int p[20];
int plan[1<<20];
int dp[1<<20];
int num[1<<20];
int gt(int x)
{
if(x==0)return 0;
if(num[x])return num[x];
int ans=0;
int t=x;
while(t!=0)
{
ans++;
t-=t&-t;
}
return num[x]=ans;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int sum=0;
for(int i=0;i<n;i++)scanf("%d",&p[i]),sum+=p[i];
sort(p,p+n,greater<int>());
for(int i=1;i<=m;i++)
{
int tn;
scanf("%d",&tn);
int x=0;
for(int j=1;j<=tn;j++)
{
int w;
scanf("%d",&w);
x|=1<<w-1;
}
plan[x]=1;
}
dp[0]=0;
for(int i=1;i<1<<n;i++)
{
for(int j=i&(i-1);1;j=i&(j-1))
{
int e=0;
if(plan[i^j])e=p[gt(i)-1];
else e=0;
dp[i]=max(dp[i],dp[j]+e);
if(j==0)break;
}
}
printf("%d\n",sum-dp[(1<<n)-1]);
return 0;
}
版权声明
本文为[Zimba_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43785386/article/details/103946695
边栏推荐
- 按需引入vant组件
- Object.create()原理,Object.create()规范,手写Object.create(),Object.create()用法
- 可视化常见绘图(四)柱状图
- DMR system solution of Kaiyuan MINGTING hotel of Fengqiao University
- 小程序wx.previewMedia相关问题解决-日常踩坑
- 学习笔记5-梯度爆炸和梯度消失(K折交叉验证)
- 各类日期转化的utils
- PyTorch 9. optimizer
- PyTorch 22. Pytorch common code snippet collection
- 在项目中的定时作用
猜你喜欢

可视化常见问题解决方案(七)画图刻度设置解决方案

hql求一个范围内最大值

可视化常见问题解决方案(八)共享绘图区域问题解决方案

菜菜的并发编程笔记 |(九)异步IO实现并发爬虫加速

Meishe technology launches professional video editing solution for desktop -- Meiying PC version

ES6之箭头函数细谈

免费开源农业物联网云平台(Version:3.0.1)

manjaro安装与配置(vscode,微信,美化,输入法)

Emergency air space integrated communication system scheme of Guangxi Power Grid

Tensorflow安装后ImportError: DLL load failed: 找不到指定的模块,且国内安装缓慢
随机推荐
可视化常见绘图(一)堆叠图
大型体育赛事无线通信系统
安装tui-editor失败,快速解决方案
通用型冒泡、选择、插入、希尔、快速排序的代码实现
The people of Beifeng have been taking action
Urban emergency management - urban emergency communication command and dispatching system
Transformer的pytorch实现
理解补码的要点
华为云MVP邮件
Jiangning hospital DMR system solution
Swin transformer to onnx
javscript获取文件真实后缀名
Hanlp分词器(通过spark)
go语言:在函数间传递切片
江宁医院DMR系统解决方案
菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记
通过sparksql读取presto中的数据存到clickhouse
How to improve the service efficiency of the hotel without blind spots and long endurance | public and Private Integrated walkie talkie?
数据分析学习(一)数据分析和Numpy基础
电力行业巡检对讲通信系统