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 ...
随机推荐
- Oracle的regexp_instr函数简单用法
REGEXP_INSTR函数让你搜索一个正则表达式模式字符串.函数使用输入字符集定义的字符进行字符串的计算. 它返回一个整数,指示开始或结束匹配的子位置,这取决于return_option参数的值. ...
- 过滤sql特殊字符方法集合
/// <summary> /// 过滤不安全的字符串 /// </summary> /// <param name="Str" ...
- zabbix_server.conf 详解
# This is a configuration file for Zabbix server daemon # To get more information about Zabbix, visi ...
- ceph 文件系统(cephfs) -- 初体验
一.介绍: ceph MDS 是元数据服务器,只有ceph 文件系统(cephFS)才会需要. cephFS 在RADOS 层之上 提供一个兼容POSIX 的文件系统.他是用MDS 作为守护进程,负责 ...
- WAS 默认端口列表
- 排列组合或容斥原理 SPOJ - AMR11H
题目链接: https://vjudge.net/contest/237052#problem/H 这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量, ...
- leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)
传送门:点我 978. Longest Turbulent Subarray A subarray A[i], A[i+1], ..., A[j] of A is said to be turbule ...
- C++中的字符数组与字符指针
//[C++基础]字符数组和字符指针.cpp//剑指offer上的这段话://为了节省内存,c/c++把常量字符串放到单独的一个内存空间.但是当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的 ...
- 设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...
- pom.xml中坐标的组成
坐标=组织(也就是所谓的公司名称)+项目名称+版本(如果不加范围默认为compile)