当前位置:网站首页>简单易懂的子集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
边栏推荐
猜你喜欢

江宁医院DMR系统解决方案

el-date-picker中自定义快捷选项picker-options,动态设置禁用日期

枫桥学院开元名庭酒店DMR系统解决方案

记录一个查询兼容性的网站,String.replaceAll()兼容性报错

H5案例开发

直观理解熵

DMR system solution of Kaiyuan MINGTING hotel of Fengqiao University

Jupyter Notebook 安装

hql求一个范围内最大值

Emergency air space integrated communication system scheme of Guangxi Power Grid
随机推荐
使用el-popconfirm和el-backtop不生效
# 可视化常见绘图(二)折线图
推导式与正则式
LATEX公式注意事项
关于'enum'枚举类型以及结构体的问题。
通过sparksql读取presto中的数据存到clickhouse
Metro wireless intercom system
获取字符格式的当前时间
VIM使用
可视化常见问题解决方案(七)画图刻度设置解决方案
unhandled system error, NCCL version 2.7.8
[8] Assertion failed: dims. nbDims == 4 || dims. nbDims == 5
el-table的数据更新后,页面中数据未更新this.$forceUpdate()无效果
PyTorch 13. Nested functions and closures (dog head)
null和undefined的区别
Typora语法详解(一)
Flexible blind patch of ad hoc network | Beifeng oil and gas field survey solution
理解补码的要点
golang实现MD5,SHA256,bcrypt加密
使用compressorjs压缩图片,优化功能,压缩所有格式的图片