Gym-100883F、Gym-101095B状态压缩小结
状态压缩的核心思想就是将数压缩成二进制,用二进制位来表示对应的位能取或者不能取,相比起来很方便。
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状态压缩小结的更多相关文章
- GYM 101933E 状态压缩 + 记忆化搜索
题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大? 思路:因为n和m的范围很小,我们可 ...
- 状态压缩dp小结
最近一段时间算是学了一些状态压缩的题目,在这里做个小结吧 首先是炮兵布阵类题目,这类题目一开始给定一个矩形,要求在上面放置炮兵,如果在一格放了炮兵那么周围的某些格子就不能放炮兵,求最大能放置炮兵的数量 ...
- [动态规划]状态压缩DP小结
1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...
- [poj3904]Sky Code_状态压缩_容斥原理
Sky Code poj-3904 题目大意:给你n个数,问能选出多少满足题意的组数. 注释:如果一个组数满足题意当且仅当这个组中有且只有4个数,且这4个数的最大公约数是1,$1\le n\le 10 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- HDU 3605:Escape(最大流+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...
- [HDU 4336] Card Collector (状态压缩概率dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)
B. Preparing Olympiad You have n problems. You have estimated the difficulty of the i-th one as inte ...
随机推荐
- 基础DP(初级版)
本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...
- Framework7框架结构
以2017年2月10日发布的Framework7 1.5.3为例. (function(){ 'use strict'; window.Framework7 = function(){ var app ...
- python------栈和队列的实现
一.神马是栈 古有粮仓,即为栈.粮仓的特点就是最后放进去的谷粒,放在最上面.打仗行军,取粮是怎么取最快?肯定是最先取最上面的!栈这一种常用到的数据结构就是这种特点:后进先出(Last In First ...
- linux命令学习之:du
du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 语法 du [选项][文件] 选项 -a或-all 显示目录中个 ...
- linux命令学习之:mv
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 命令格式 mv [选项] 源文件或目 ...
- MyBatis代理开发(2)
一.开发步骤和程序代码 1.程序员需要编写user.xml映射文件,程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象. 2.创建数据库配置文件 ...
- @params、@PathVariabl和@RequestParam用法与区别
[1]params params: 指定request中必须包含某些参数值是,才让该方法处理. @RequestMapping(value = "testParamsAndHeaders&q ...
- eclipse中运行tomcat提示端口被占的4种解决方案
错误信息:Several ports (8005, 8080, 8009) required by Tomcat v5.5 Server at localhost are already in use ...
- 服务器webapi集成极光推送学习笔记
一路坎坷,坑死你!!!入坑需做好心理准备. 第一天: 其文档支持不给力,和微信的文档支持比起来能气死你,刚开始弄,看了一大堆东西,找不到头绪从哪里开始弄.只好找了一些文档,先了解了其基本原理,参考文章 ...
- javascript 获取html元素的三种方法
操作HTML元素 你首先找到该元素. 三种方法来做这件事: 通过id找到HTML元素 通过标签名找到HTML元素 通过类名找到HTML元素 通过id查找HTML元素 在DOM中查找HTML元素的最简单 ...