较快速的最大带权独立集算法
前言
重新来吧 别输在过去最得意的事上。
只是单纯的记录一下这个小知识点。
很多时候,题目可以转化为求最大带权最小点覆盖或者是最大独立集。
但是他又经常把这个范围给到
可能这个时候你就需要用到短小精悍的它。
基于状压和折半的独立集算法
首先给出我开始弄明白这个小知识点的来源题目:CF1767E Algebra Flash
题意是比较清楚的。
而你要从起点到达终点的一个充分必要条件是:
-
必须选择起点和终点。
-
相邻两个点必须选择一个点。
故你考虑对于起点和终点的颜色连一个自环,然后将相邻两个点分别对应的颜色连一条边。
故这个题就转化成了一个一般图最小带权点覆盖的问题。
而我们知道最小带权点覆盖
故我们只需要知道这个图的最大带权独立集是什么。
首先有一个很
另外,我们定义点
转移的话本质上我们只需要考虑这个集合中的任意一个点就行了,为了方便我们后面的优化,考虑
显然有:
时间复杂度
但是这里
于是我们考虑一个奇技淫巧,也是这个算法的关键所在。
首先先把这个
long long dfs(long long sta)
{
if(sta <= lim && ~dp[sta]) return dp[sta];
if(sta == 0) return 0;
int x = __lg(sta);
long long ans = dfs(sta - (1ll << x));
if(!((1ll << x) & d[x + 1])) ans = max(ans, dfs(sta - (1ll << x) - (sta & d[x + 1])) + w[x + 1]);
if(sta <= lim) return dp[sta] = ans;
return ans;
}
时间复杂度我们简单的证明一下。
对于搜索的前
对于后面的
故总时间复杂度
本题代码和更多细节见此。
后记
还有一个叫做
缝缝补补,缺漏的知识点会补的完吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】