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

  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. 无法打开工作组信息文件中的表 'MSysAccounts',一个十分搞笑的解决方法

    问题提出:从access97导出一个mdb到access2000 为了程序使用命名为system.mdb,后改名为system.dat 在c#中打开,出现 无法打开工作组信息文件中的表 'MSysAc ...

  2. helm 更改为国内源

     helm init --upgrade -i slpcat/tiller:v2.8.2 --stable-repo-url https://kubernetes.oss-cn-hangzhou.al ...

  3. elk6快速安装

    rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch [elasticsearch-6.x] name=Elasticsear ...

  4. 调用高德地图API(热力图)详解

    具体脚本语言如下: <!doctype html> <html> <head> <meta charset="utf-8"> < ...

  5. android 常用渐变背景绘制

    从上到下绘制如图所示 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android= ...

  6. stm32学习基本知识点

    1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为st ...

  7. mybatis批量更新update-设置多个字段值 报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    mybatis批量更新update-设置多个字段值 2016年08月01日 12:49:26 姚一号 阅读数:29539 标签: mysql mybatis批量更新批量更新allowMultiQuer ...

  8. [leetcode]127. Word Ladder单词接龙

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...

  9. clickableSpan实现textView文字部分点击有响应

    先定义一个clickableSpan的子类 class MyClickText extends ClickableSpan{ private Context context; public MyCli ...

  10. 处理后台向前台传递的json数据

    在pom文件中添加下面三种依赖jar包 <dependency> <groupId>com.fasterxml.jackson.core</groupId> < ...