关于状态压缩DP以及状态压缩
2024-09-06 22:15:18
首先要明确:状态压缩是利用数字来代表一组序列的方法,从而降低序列访问的复杂度,本质上跟HASH有着差不多的思想,但是其实就是数位运算的一种
定义:集合中共有N个数字,其中每个数字均小于K,能么我们可以用N位K进制数来表示整个集合,能么该数字转化为十进制数字(也就是int or long long),整个状态的表示就变成了一个数字
状态的表示i实际上就是利用数字来扩充代表的范围
最典型的一道例题:
USACO 06 corn fields
题目中给定一个N*M的矩阵,其中1代表可操作,0代表不可操作
让你选择其中可操作的点,问给定的矩阵中,两两选定的点不相邻的选择方案数一共有多少种
这是一道非常非常典型的状态压缩DP的问题,阶段可以表示为每一行,其中状态表示当前行中被选定的合法的被操作的点的集合!
其中预处理每行中每种情况的合法性,以及每种情况与每行中能被操作的点的合法性的处理
/* USACO 06 Corn Fields */ #include <bits/stdc++.h> using namespace std; const int MOD=(int)1e9; ][]; /* 4096表示为状态压缩 */ ][]; ]; /* 每行的状态Field的状态 */ ]; int n, m; int main(){ cin>>n>>m; ;i<=n;i++) ;j<=m;j++) cin>>Field[i][j]; ;i<=n;i++) ;j<=m;j++) Fline[i]=(Fline[i]<<)+Field[i][j]; <<m; ;i<MAX;i++) state[i]=(!(i & (i<<)) && !(i & (i>>))); /* for(int i=0;i<MAX;i++) cout<<state[i]<<" "; cout<<endl; */ dp[][]=; ;i<=n;i++) ;j<MAX;j++) if(state[j] && ((j&Fline[i])==j)) ;k<MAX;k++) ) dp[i][j]=(dp[i][j]+dp[i-][k])%MOD; /* for(int i=1;i<=n;i++){ for(int j=0;j<MAX;j++) cout<<dp[i][j]<<" "; */ /* cout<<endl; } */ ; ;i<MAX;i++) ans=(ans+dp[n][i])%MOD; cout<<ans; ; }
最新文章
- Spring中文文档-第一部分
- 从up6-down2升级到down3
- VMware Workstation cannot connect to the virtual machine 解决方案
- NameThreadForDebugging -- Naming threads for debugging
- [转载]BigPipe技术
- poj1141Brackets Sequence(dp+路径)
- 解决nginx session共享的问题
- junit测试用例加载spring配置文件
- Java调用ICTCLAS2015
- cell中button怎么得到对应cell的indexpath 以及关于UITableViewCellContentView的问题
- 自制Linux 终端 锁屏防窃助手
- LeetCode之“动态规划”:Interleaving String
- python抓取NBA现役球员基本信息数据并进行分析
- Django自带的用户认证auth模块
- windows yii2 配置redis
- jmeter内存溢出解决办法
- PHP异常处理、错误捕获和自动加载的一些总结
- epel安装第三方扩展源后,运行yum报错的解决方案
- 怎样删除PeopleSoft进程服务器定义
- Android动画学习笔记大集合
热门文章
- C++如何拒绝编译器自动生成的函数
- printf 小代码 大问题
- OpenCV - Windows(win10)编译opencv + opencv_contrib
- 说几个JS优化技巧吧
- 汇编题目:在DOS下,按F1键后改变当前屏幕的显示颜色
- UOJ #348 州区划分 —— 状压DP+子集卷积
- HDU1042(N!:设4为基数)
- 报错之-Cannot set property &#39;onclick&#39; of null
- MyBatis构建sql时动态传入表名以及字段名
- [解决问题]ubuntu无法virtualenv创建python虚拟环境的解决