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

  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. js前端导出excel:json形式的导出

    第一中形式的导出:主要是表头对应主体数据,json形式的导出 js库文件名称 : table2excel.js这个js库文件是网上找的,并且自己根据自己业务需求把内容改了一下复制到 table2exc ...

  2. [转]github详细教程

    GitHub详解 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目.它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath ...

  3. 100-days: Two

    Title: London HIV patient's remission spurs hope for curing AIDS HIV 艾滋病毒  human immunodeficiency vi ...

  4. QT注意事项(持续更新...)

    同样要注意new和delete的问题: is not a member of QApplication:这个错误可能是找不到信号或槽函数: 想用到信号槽,必须至少继承QObject类,并在类第一行写上 ...

  5. f5会话保持

    B/S架构的建议选择 inset cookie :c/s架构的 建议选择 sorce ip 1.  Introduction to session persistence profiles Using ...

  6. cloud配置中心遇到的坑

    https://blog.csdn.net/z960339491/article/details/80593982分布式配置中心为什么要有用分布式配置中心这玩意儿?现在这微服务大军已经覆盖了各种大小型 ...

  7. VS2008水晶报表变两页(重装系统后)

    找到水晶报表中的设置-打印机设置,发现打印机名称是 Microsoft XPS Document Writer (已重定向2),

  8. for all entries

    1.必须要判断for all entries in后面的内表是否为空,如果为空,where条件中与内表中字段进行比较的结果全部为真,会导致取出非常多的数据,影响系统性能.2.使用for all ent ...

  9. java 动手动脑解决问题

    1.Java的基本运行单位是类还是方法?是类,因为没有方法可以独立存在,方法在逻辑上属于类或属于对象. 2.类的组成成员?成员变量,成员方法. 3.成员变量的种类? byte short int lo ...

  10. android的Afinal框架下的数据库更新

    项目需要,版本升级时给表添加了一些新的字段,发现出现异常. 解决方法:监听数据库的版本号,更新数据库. 创建FinalDb对象时使用如下的构造函数,监听版本号的变化: db = FinalDb.cre ...