牛客第五场 E independent set 1 —— 状压 dp

本文介绍了一种使用状压动态规划方法解决特定规模下最大独立集问题的算法。针对n≤26的场景,通过位运算记录点与点之间的连接状态,实现了高效求解最大独立集和的目标。文章详细解释了状压DP的核心思想,包括如何利用__builtin_ctz函数确定最低位1的位置,以及如何更新dp数组来存储最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点我啊╭(╯^╰)╮

题目大意:

     n n n 个点,求所有能组成的集的最大独立集的和

解题思路:

     n ≤ 26 n≤26 n26,所以可以 状压 d p dp dp
     a x a_x ax 表示 x x x 这个点连的边的状态
     l b x lb_x lbx 表示 x x x 二进制中最低位为 1 1 1 的位置
    __ b u i l t i n builtin builtin_ c t z ( x ) ctz(x) ctz(x) 表示 x x x 末尾有多少个 0 0 0
     d p [ x ] dp[x] dp[x] 表示 x x x 这个集的最大独立集的 s i z e size size

    然后随便删去一个点, x x x d p dp dp 值即为删去后的答案与未删的答案 + 1 +1 +1 m a x max max
     d p [ x ] = m a x ( d p [ x ⨁ l b ] , c h a r ( d p [ x dp[x] = max(dp[x \bigoplus lb], char(dp[x dp[x]=max(dp[xlb],char(dp[x & (   a [ _ _ b u i l t i n _ c t z ( x ) ] ) ] + 1 ) ) (~a[\_\_builtin \_ctz(x)])] + 1)) ( a[__builtin_ctz(x)])]+1))

     P S : PS: PS题目卡内存。。用 4 4 4 字节的 i n t int int 会爆
               需要用 1 1 1 字节的 c h a r char char ,最多只能存 255 > n 255 > n 255n

核心:位元状压dp与独立集的应用

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
using pii = pair <ll,int>;
int n, m, a[26];
ll ans;
char dp[(1<<26) + 5];

int lowbit(int x){
	return x & (-x);
}

int main() {
	scanf("%d%d", &n, &m);
	while(m--){
		int u, v;
		scanf("%d%d", &u, &v);
		a[u] |= (1<<v); 
		a[v] |= (1<<u); 
	}
	for(int i=0; i<n; i++) a[i] |= (1<<i);
	for(int s=1; s<(1<<n); s++){
		int lb = lowbit(s);
		dp[s] = max(dp[s^lb], char(dp[s&(~a[__builtin_ctz(s)])] + 1));
		ans += int(dp[s]);
	}
	printf("%lld\n", ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值