当前位置: 首页 > news >正文

【笔记】状压 DP

Luogu P1896 [SCOI2005] 互不侵犯

因为一行的状态只有放与不放国王,所以可以用 \(0\)\(1\) 表示,然后就可以把一行的状态压缩成一个 \(9\) 位二进制数表示,状态个数为 \(2^9\)。随后定义状态 \(f(i,j,s)\) 表示前 \(i\) 行放 \(j\) 个国王,最后一行状态为 \(s\) 的方案数。先 DFS 求出一行的所有状态,然后暴力枚举相邻两行的状态,判断合法性,如果合法就进行状态转移:\(f(i,j,s)=f(i-1,j-sta_{cnt1},sit_{cnt2})\),其中 \(sta\) 存储的是每个状态摆放的国王数量,\(sit\) 存储的是每个状态,\(cnt1\)\(cnt2\) 分别记录了第 \(i-1\) 行和第 \(i\) 行的状态编号。

最后统计答案,即为把所有摆 \(i\) 行、\(k\) 个国王的方案数累加。方案数和累加结果记得开 long long

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n,m,cnt;
long long ans;
int king[2010],state[2010],f[10][110][2010];
void dfs(int s,int cur,int num){if(cur>=n){state[++cnt]=num;king[cnt]=s;return ;}else{dfs(s,cur+1,num);dfs(s+(1<<cur),cur+2,num+1);}
}
bool check(int a,int b){if((king[a]<<1)&king[b]) return 0;if((king[a]>>1)&king[b]) return 0;if((king[a])&king[b]) return 0;return 1;
}
signed main(){scanf("%lld%lld",&n,&m);dfs(0,0,0);for(int i=1;i<=cnt;i++){f[1][state[i]][i]=1;}for(int i=2;i<=n;i++){for(int j=1;j<=cnt;j++){for(int k=1;k<=cnt;k++){if(!check(j,k)) continue;for(int l=state[j];l<=m;l++){f[i][l][j]+=f[i-1][l-state[j]][k];}}}}for(int i=1;i<=cnt;i++) ans+=f[n][m][i];cout<<ans;return 0;
} 

至于时间复杂度,比较难估计,大概是 \(O(4^n \times nk)\)。总之 \(n\) 很小,跑得很快(实测洛谷数据 57ms,loj 还没有测)。

空间是三维的,要注意不要开太大。

Luogu P5911 [POI2004] PRZ

这个题是一道典型的枚举子集。把集合状压并预处理出每个子集所需要的最大时间 \(t_i\) 和重量 \(w_i\),枚举所有人构成的集合 \(S\) 中的子集 \(i\)\(i\) 的子集 \(j\),那么:

\[dp_i=\min(dp_i,t_i+dp_{i \oplus j})(w_j \le W) \]

这里枚举子集 \(j\) 不能先枚举集合再判断是否为 \(i\) 的子集,这样时间复杂度会来到 \(O(4^n)\),过不了。应当使用 子集枚举,时间复杂度来到 \(O(3^n)\)

http://www.gsyq.cn/news/89296.html

相关文章:

  • 基于java的SpringBoot/SSM+Vue+uniapp的零工市场服务系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 美团原生AI编辑器
  • 基于java的SpringBoot/SSM+Vue+uniapp的旅游出行指南系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 2025 最新租房/找房平台 TOP4 评测!数智化赋能 + 全维服务权威榜单发布,重构居家生活服务新生态 - 全局中转站
  • Linux 中如何将文本中连续的字段转换成一个字段显示
  • 在写小故事
  • XTOOL D9 EV 1-Year Update Service: Keep Your EV Diagnostics Updated Reliable
  • 基于SpringBoot的房屋租赁系统的设计与实现毕业设计项目源码
  • 【笔记】基本数论
  • 19、将 Snort 规则转换为 iptables 规则
  • 教程 29 - 从磁盘加载纹理
  • 20、深入理解Snort规则选项与iptables数据包过滤
  • FPGA教程系列-Vivado Aurora 8B/10B 例程解读
  • 基于SpringBoot的大学生在线考试平台的设计与实现毕业设计项目源码
  • 003-RSA魔改:一号店
  • Jeecg AI开源平台:零门槛构建AI应用的完整指南
  • 与AI共舞:当代大学生如何在智能时代重塑学习与成长
  • 【题解】Luogu P1310 [NOIP 2011 普及组] 表达式的值
  • Flink学习笔记:状态类型和应用
  • 2025贵阳公墓/公益公墓top5推荐!贵阳优质生态陵园榜单发布,合规保障与人文关怀兼具的安息之所推荐 - 全局中转站
  • AI核心知识50——大语言模型之Scaling Laws(简洁且通俗易懂版)
  • MySQL 深分页查询优化实践与经验总结
  • 电机多目标优化与灵敏度分析:探索电机性能提升之道
  • 打造下一个爆款!专业短剧APP全栈开发解决方案,解锁万亿级市场红利
  • 毕业论文选题AI推荐:9大工具+热门方向合集
  • C51_AH3144霍尔传感器
  • 16 位 SAR ADC 逐次逼近型 ADC 模拟集成电路设计探秘
  • 5 分钟快速入门 Gitlab CI/CD
  • 【题解】Luogu P13885 [蓝桥杯 2023 省 Java/Python A] 反异或 01 串
  • 【笔记】Manacher