首先要明确:状态压缩是利用数字来代表一组序列的方法,从而降低序列访问的复杂度,本质上跟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;

     ;
 }

最新文章

  1. Spring中文文档-第一部分
  2. 从up6-down2升级到down3
  3. VMware Workstation cannot connect to the virtual machine 解决方案
  4. NameThreadForDebugging -- Naming threads for debugging
  5. [转载]BigPipe技术
  6. poj1141Brackets Sequence(dp+路径)
  7. 解决nginx session共享的问题
  8. junit测试用例加载spring配置文件
  9. Java调用ICTCLAS2015
  10. cell中button怎么得到对应cell的indexpath 以及关于UITableViewCellContentView的问题
  11. 自制Linux 终端 锁屏防窃助手
  12. LeetCode之“动态规划”:Interleaving String
  13. python抓取NBA现役球员基本信息数据并进行分析
  14. Django自带的用户认证auth模块
  15. windows yii2 配置redis
  16. jmeter内存溢出解决办法
  17. PHP异常处理、错误捕获和自动加载的一些总结
  18. epel安装第三方扩展源后,运行yum报错的解决方案
  19. 怎样删除PeopleSoft进程服务器定义
  20. Android动画学习笔记大集合

热门文章

  1. C++如何拒绝编译器自动生成的函数
  2. printf 小代码 大问题
  3. OpenCV - Windows(win10)编译opencv + opencv_contrib
  4. 说几个JS优化技巧吧
  5. 汇编题目:在DOS下,按F1键后改变当前屏幕的显示颜色
  6. UOJ #348 州区划分 —— 状压DP+子集卷积
  7. HDU1042(N!:设4为基数)
  8. 报错之-Cannot set property &#39;onclick&#39; of null
  9. MyBatis构建sql时动态传入表名以及字段名
  10. [解决问题]ubuntu无法virtualenv创建python虚拟环境的解决