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 ...
随机推荐
- PHP判断是否都是中文
{ } }
- 合并两个排序的链表(python)
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...
- CentOS 几种重启方式的区别
Linux centos重启命令: 1.reboot 普通重启 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户 ...
- NumPy 统计函数
NumPy 统计函数 NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等. 函数说明如下: numpy.amin() 和 numpy.amax() numpy.a ...
- Gym - 101911C Bacteria (规律题)
传送门:点我 Time limit2000 ms Memory limit262144 kB Recently Monocarp has created his own mini-laboratory ...
- 项目总结12:bootstrap-select下拉框模糊搜索
bootstrap select下拉框模糊搜索 关键字 bootstrap-select 下拉框模糊搜索 正文(直接上源码) <%@ page language="java" ...
- 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析
一.目录分析 用yum的方式进行安装实质上装的都是一个个的rpm包,对于linux系统rpm包管理器,我们使用命令rpm -ql 服务名称 就可以列出我们已经安装的服务所对应安装的每一个文件所在的目 ...
- 489. Robot Room Cleaner扫地机器人
[抄题]: Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or block ...
- avalon子孙元素属性监听
HTML正文: <body ms-controller="ex"> <div class="ms-hover" ms-click=" ...
- mysql 存储过程 与 循环
mysql 操作同样有循环语句操作,三种标准循环模式:while, loop,repeat, 外加一种非标准循环:goto [在c或c#中貌似出现过类型循环但是一般不建议用!] 一般格式为:delim ...