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

  Eg:Gym-100883F

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

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

char a[100], b[100];

map<string, int>mp;

void solve() {
mp.clear(); int num=0;
scanf("%s %s", a, b);
string ans[maxn];
int lena=strlen(a), lenb=strlen(b);
for (int i = 0; i < (1<<(lena+lenb)); i++) {
int num1=0, num0=0;
int aa=0, bb=0;
for (int j = 0; j < lena+lenb; j++) {
if ((1<<j)&i) {  //表示j位置取不取
num1++;
}
}
if (num1==lena) {
for (int j=0; j < lena+lenb; j++) {
if ((1<<j)&i) {
ans[num]+=a[aa++];
}
else ans[num]+=b[bb++];
}
num++;
}
}
sort(ans, ans+num);
ans[num] = "A";
for (int i = 0; i < num; i++) {
if (ans[i]!=ans[i+1]) cout << ans[i] << endl;
}
cout << endl;
}
int main() {
//cin.sync_with_stdio(false);
//freopen("in.txt", "r", stdin);
//freopen("isharp.out", "w", stdout);
int t = 1;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}

  

  Gym-101095B

  

char ma[25][25];
int maa[25][25];
int m[25][25];
int r, c, ans;
int dir[][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}}; bool safe(int x, int y) {
if (x<0||x>=r||y<0||y>=c) return 0;
return 1;
}
int deal() {
int nu=0;
for (int i = 1; i < r; i++) {
for (int j=0; j < c; j++) {
if (maa[i-1][j]==0) {
nu++;
maa[i][j]^=1;
for (int k=0; k<4; k++) {
int xx=i+dir[k][0], yy=j+dir[k][1];
if (safe(xx, yy)) {
maa[xx][yy]^=1;
}
}
}
}
}
for (int i = 0; i < r; i++) {
for (int j =0; j < c;j++) {
if (!maa[i][j]) return -1;
}
}
return nu;
}
void solve() {
memset(ma, 0, sizeof(ma));
memset(m, 0, sizeof(m));
while(scanf("%d%d", &r, &c)) {
if (!r&&!c) break; ans = inf;
int flag=0;
for (int i=0; i < r; i++)
scanf("%s", ma[i]);
if (r<c) {
char mm[25][25];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
mm[j][i] = ma[i][j];
}
}
swap(r, c);
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
ma[i][j] = mm[i][j];
}
} }
// for (int i=0; i < r; i++) cout << ma[i] << endl;
for (int i=0; i < r; i++) {
for (int j=0; j<c; j++) {
if (ma[i][j]=='X') m[i][j]=0;
else m[i][j]=1;
}
}
for (int i = 0; i < (1<<c); i++) {
for (int ii=0; ii<r; ii++) {
for (int jj=0; jj < c; jj++) {
maa[ii][jj] = m[ii][jj];
}
}
int num=0;
for (int j=0; j < c; j++) {
if ((1<<j)&i) {
num++;
maa[0][j]=maa[0][j]^1;
for (int ii=0; ii<4; ii++) {
int xx=0+dir[ii][0], yy=j+dir[ii][1];
if (safe(xx, yy)) {
maa[xx][yy] ^= 1;
}
}
}
}
int tmp = deal();
if (tmp == -1) continue;
num += tmp;
ans = min(ans, num);
flag=1; }
if (flag)printf("You have to tap %d tiles.\n", ans);
else puts("Damaged billboard.");
}
}
int main() {
//cin.sync_with_stdio(false);
//freopen("in.txt", "r", stdin);
//freopen("isharp.out", "w", stdout);
int t = 1;
while (t--) {
solve();
}
return 0;
}

  

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. cef研究

    // Copyright (c) 2010 The Chromium Embedded Framework Authors. All rights // reserved. Use of this s ...

  2. python使用websocket简单组建聊天室

    server端 ###websocket_server### import socket import threading sock = socket.socket(socket.AF_INET, s ...

  3. String int 相互转换

    String->int: int i = Integer.parseInt(s) int->String: String s = Integer.toString(i)

  4. PHP-自动加载原理分析

    说起PHP的自动加载,很多同学可能都会想到各种框架的自动加载功能,PHP规范中的PSR0和PSR4原则,Composer的自动加载功能等等,这些都为我们的开发提供了很大的方便. 那么PHP自动加载的前 ...

  5. MYSQL之水平分区----MySQL partition分区I(5.1)

    一.        分区的概念 二.        为什么使用分区?(优点) 三.        分区类型 四.        子分区 五.        对分区进行修改(增加.删除.分解.合并) 六 ...

  6. ztree-持续更新中

    版本v3快速入门: 1,官网下载https://gitee.com/zTree/zTree_v3 2,zTree-zTree_v3-master\zTree_v3下复制css和js文件夹到项目下 3, ...

  7. 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'

    80*25彩色字符模式显示缓冲区的结构: 内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区.向这个地址空间写入数据,写入的内容将立即出现在显示器上. 在 ...

  8. 微信小程序 循环列表添加点击事件和样式

    如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 <input/> 中的输入内容,<switch/> 的选中状态),需要使 ...

  9. android 开发概述以及相关背景知识

    参考链接:http://www.runoob.com/android/android-architecture.html http://www.runoob.com/android/android-a ...

  10. 基于vue的悬浮碰撞窗口(用于打广告的)组件

    由于项目需要改写了一个悬浮碰撞弹窗组件 <template> <div class="floatLayer"> <a class="clos ...