状态压缩的核心思想就是将数压缩成二进制,用二进制位来表示对应的位能取或者不能取,相比起来很方便。

  Eg:Gym-100883F

  题意:给你两个字符串,要求你将两个字符串合起来,并不改变原先的顺序,一共有多少种情况。

  首先看到这个想到的是dfs,而我傻傻的用next_permutation华丽丽的T了,我好瓜皮啊,嘻嘻,这个题不仅仅可以用dfs写,还可以用状态压缩。

  1. char a[100], b[100];
  2.  
  3. map<string, int>mp;
  4.  
  5. void solve() {
  6. mp.clear(); int num=0;
  7. scanf("%s %s", a, b);
  8. string ans[maxn];
  9. int lena=strlen(a), lenb=strlen(b);
  10. for (int i = 0; i < (1<<(lena+lenb)); i++) {
  11. int num1=0, num0=0;
  12. int aa=0, bb=0;
  13. for (int j = 0; j < lena+lenb; j++) {
  14. if ((1<<j)&i) {  //表示j位置取不取
  15. num1++;
  16. }
  17. }
  18. if (num1==lena) {
  19. for (int j=0; j < lena+lenb; j++) {
  20. if ((1<<j)&i) {
  21. ans[num]+=a[aa++];
  22. }
  23. else ans[num]+=b[bb++];
  24. }
  25. num++;
  26. }
  27. }
  28. sort(ans, ans+num);
  29. ans[num] = "A";
  30. for (int i = 0; i < num; i++) {
  31. if (ans[i]!=ans[i+1]) cout << ans[i] << endl;
  32. }
  33. cout << endl;
  34. }
  35. int main() {
  36. //cin.sync_with_stdio(false);
  37. //freopen("in.txt", "r", stdin);
  38. //freopen("isharp.out", "w", stdout);
  39. int t = 1;
  40. scanf("%d", &t);
  41. while (t--) {
  42. solve();
  43. }
  44. return 0;
  45. }

  

  Gym-101095B

  

  1. char ma[25][25];
  2. int maa[25][25];
  3. int m[25][25];
  4. int r, c, ans;
  5. int dir[][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
  6.  
  7. bool safe(int x, int y) {
  8. if (x<0||x>=r||y<0||y>=c) return 0;
  9. return 1;
  10. }
  11. int deal() {
  12. int nu=0;
  13. for (int i = 1; i < r; i++) {
  14. for (int j=0; j < c; j++) {
  15. if (maa[i-1][j]==0) {
  16. nu++;
  17. maa[i][j]^=1;
  18. for (int k=0; k<4; k++) {
  19. int xx=i+dir[k][0], yy=j+dir[k][1];
  20. if (safe(xx, yy)) {
  21. maa[xx][yy]^=1;
  22. }
  23. }
  24. }
  25. }
  26. }
  27. for (int i = 0; i < r; i++) {
  28. for (int j =0; j < c;j++) {
  29. if (!maa[i][j]) return -1;
  30. }
  31. }
  32. return nu;
  33. }
  34. void solve() {
  35. memset(ma, 0, sizeof(ma));
  36. memset(m, 0, sizeof(m));
  37. while(scanf("%d%d", &r, &c)) {
  38. if (!r&&!c) break;
  39.  
  40. ans = inf;
  41. int flag=0;
  42. for (int i=0; i < r; i++)
  43. scanf("%s", ma[i]);
  44. if (r<c) {
  45. char mm[25][25];
  46. for (int i = 0; i < r; i++) {
  47. for (int j = 0; j < c; j++) {
  48. mm[j][i] = ma[i][j];
  49. }
  50. }
  51. swap(r, c);
  52. for (int i = 0; i < r; i++) {
  53. for (int j = 0; j < c; j++) {
  54. ma[i][j] = mm[i][j];
  55. }
  56. }
  57.  
  58. }
  59. // for (int i=0; i < r; i++) cout << ma[i] << endl;
  60. for (int i=0; i < r; i++) {
  61. for (int j=0; j<c; j++) {
  62. if (ma[i][j]=='X') m[i][j]=0;
  63. else m[i][j]=1;
  64. }
  65. }
  66. for (int i = 0; i < (1<<c); i++) {
  67. for (int ii=0; ii<r; ii++) {
  68. for (int jj=0; jj < c; jj++) {
  69. maa[ii][jj] = m[ii][jj];
  70. }
  71. }
  72. int num=0;
  73. for (int j=0; j < c; j++) {
  74. if ((1<<j)&i) {
  75. num++;
  76. maa[0][j]=maa[0][j]^1;
  77. for (int ii=0; ii<4; ii++) {
  78. int xx=0+dir[ii][0], yy=j+dir[ii][1];
  79. if (safe(xx, yy)) {
  80. maa[xx][yy] ^= 1;
  81. }
  82. }
  83. }
  84. }
  85. int tmp = deal();
  86. if (tmp == -1) continue;
  87. num += tmp;
  88. ans = min(ans, num);
  89. flag=1;
  90.  
  91. }
  92. if (flag)printf("You have to tap %d tiles.\n", ans);
  93. else puts("Damaged billboard.");
  94. }
  95. }
  96. int main() {
  97. //cin.sync_with_stdio(false);
  98. //freopen("in.txt", "r", stdin);
  99. //freopen("isharp.out", "w", stdout);
  100. int t = 1;
  101. while (t--) {
  102. solve();
  103. }
  104. return 0;
  105. }

  

Gym-100883F、Gym-101095B状态压缩小结的更多相关文章

  1. GYM 101933E 状态压缩 + 记忆化搜索

    题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大? 思路:因为n和m的范围很小,我们可 ...

  2. 状态压缩dp小结

    最近一段时间算是学了一些状态压缩的题目,在这里做个小结吧 首先是炮兵布阵类题目,这类题目一开始给定一个矩形,要求在上面放置炮兵,如果在一格放了炮兵那么周围的某些格子就不能放炮兵,求最大能放置炮兵的数量 ...

  3. [动态规划]状态压缩DP小结

     1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...

  4. [poj3904]Sky Code_状态压缩_容斥原理

    Sky Code poj-3904 题目大意:给你n个数,问能选出多少满足题意的组数. 注释:如果一个组数满足题意当且仅当这个组中有且只有4个数,且这4个数的最大公约数是1,$1\le n\le 10 ...

  5. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  6. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

  7. [HDU 4336] Card Collector (状态压缩概率dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...

  8. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  9. codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)

    B. Preparing Olympiad You have n problems. You have estimated the difficulty of the i-th one as inte ...

随机推荐

  1. PHP判断是否都是中文

         {               }       }

  2. 合并两个排序的链表(python)

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...

  3. CentOS 几种重启方式的区别

    Linux centos重启命令: 1.reboot   普通重启 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户 ...

  4. NumPy 统计函数

    NumPy 统计函数 NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等. 函数说明如下: numpy.amin() 和 numpy.amax() numpy.a ...

  5. Gym - 101911C Bacteria (规律题)

    传送门:点我 Time limit2000 ms Memory limit262144 kB Recently Monocarp has created his own mini-laboratory ...

  6. 项目总结12:bootstrap-select下拉框模糊搜索

    bootstrap select下拉框模糊搜索 关键字 bootstrap-select 下拉框模糊搜索 正文(直接上源码) <%@ page language="java" ...

  7. 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析

    一.目录分析 用yum的方式进行安装实质上装的都是一个个的rpm包,对于linux系统rpm包管理器,我们使用命令rpm -ql  服务名称 就可以列出我们已经安装的服务所对应安装的每一个文件所在的目 ...

  8. 489. Robot Room Cleaner扫地机器人

    [抄题]: Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or block ...

  9. avalon子孙元素属性监听

    HTML正文: <body ms-controller="ex"> <div class="ms-hover" ms-click=" ...

  10. mysql 存储过程 与 循环

    mysql 操作同样有循环语句操作,三种标准循环模式:while, loop,repeat, 外加一种非标准循环:goto [在c或c#中貌似出现过类型循环但是一般不建议用!] 一般格式为:delim ...