poj 1308Bugs Integrated, Inc. [三进制状压]
题目链接【http://poj.org/problem?id=1038】
题意: 给出一个N*M大小的图,图中有K个坏点。N (1 <= N <= 150), M (1 <= M <= 10), K (0 <= K <= MN);用2*3和3*2的木块去填这个图,问最多能放多少个木块。
题解:用一个三进制数表示某一行的状态,如果pos位置是0:表示该位置被占用了,pos位置是1:表示该位置没有被占用但是上一层的pos位置被占用了,pos位置是2:表示该位置和上一层的该位置否没有被占用。
用数组last[]和now[]表示上一层和本层的状态(用编码器和解码器实现)如果该位置为坏点那么now[pos]=0,否则now[pos]=min(2,last[pos]+1);用DFS实现,横着放,竖着放,或者不放,最后取最后一行每个状态下的值,取最大。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = ;
int dp[][maxn], cur;
int last[], now[];
int mp[][];
int T, Last, lim;
int n, m, k;
int en_code()//编码器
{
int ans = ;
for(int i = m - ; i >= ; i--) ans = ans * + now[i];
return ans;
}
void de_code(int x)//译码器
{
for(int i = ; i < m; i++)
{
last[i] = x % ;
x /= ;
}
}
void DFS(int pos, int val, int r)
{
if(pos == m)//本行已经处理完
{
int j = en_code();
dp[cur][j] = max(dp[cur][j], dp[cur ^ ][Last] + val);
return ;
}
if(mp[r][pos])//如果当前位置是坏点,直接跳过
{
now[pos] = ;
DFS(pos + , val, r);
return ;
}
now[pos] = min(, last[pos] + );//当前行pos点的状态
if(pos > && now[pos - ] == && now[pos - ] == && now[pos] == )//横着放
{
now[pos] = now[pos - ] = now[pos - ] = ;
DFS(pos + , val + , r);
now[pos] = now[pos - ] = now[pos - ] = ;//恢复到递归前的状态
}
if(pos && now[pos - ] == && last[pos - ] == && last[pos] == )//竖着放
{
now[pos] = now[pos - ] = ;
DFS(pos + , val + , r);
now[pos] = now[pos - ] = ;//恢复到递归前的状态
}
DFS(pos + , val, r);//不放
}
int main ()
{
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &n, &m, &k);
lim = ;
cur = ;
for(int i = ; i <= m; i++) lim *= ;
memset(mp, , sizeof(mp));
for(int i = ; i <= k; i ++)
{
int x, y;
scanf("%d%d", &x, &y);
y--;
mp[x][y] = ;
}
memset(dp, -, sizeof(dp));
dp[][] = ;
for(int i = ; i <= n; i++)
{
cur ^= ;
memset(dp[cur], -, sizeof(dp[cur]));
for(int j = ; j <= lim - ; j++)
if(dp[cur ^ ][j] != -)
{
Last = j;
de_code(j);
DFS(, , i);
}
}
int ans = ;
for(int j = ; j <= lim - ; j++)
ans = max(ans, dp[cur][j]);
printf("%d\n", ans);
}
}
poj 1308Bugs Integrated, Inc. [三进制状压]的更多相关文章
- 三进制状压 HDOJ 3001 Travelling
题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...
- ZRDay6A. 萌新拆塔(三进制状压dp)
题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...
- Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]
传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- HDU 3001 三进制状压DP
N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方程: dp[i+b[k]][k]= ...
- hdu3001(三进制状压)
题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...
- POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解
题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrat ...
- hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...
- Gym 101194L / UVALive 7908 - World Cup - [三进制状压暴力枚举][2016 EC-Final Problem L]
题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...
- SPOJ - BALNUM Balanced Numbers(数位dp+三进制状压)
Balanced Numbers Balanced numbers have been used by mathematicians for centuries. A positive integer ...
随机推荐
- android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加
以下代码实现的效果是: BoundOpenView从居中移动到顶部,移动完后,BoundSendView从隐藏变为显示,并从顶部移动BoundOpenView下方20dp处,同时透明度慢慢增加. pr ...
- 用docker cluster store实现kuryr的共享subnet
kuryr共享网络 在上一篇分享中,提到共享网络需要在10.8.65.80和10.8.65.81上分别通过docker network create来创建网络.而实际上,通过对docker源码的解读, ...
- Linux-gate.so技术细节
1. linux-gate.so是什么参考这里:http://www.trilithium.com/johan/2005/08/linux-gate/简而言之,linux-gate.so是为了实现用户 ...
- Python之列表生成式、生成器、可迭代对象与迭代器
本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...
- Java 编译打包命令
背景 编译 打包 解压 运行 参考 背景 我们有的时候总是要使用将自己写的工程编译成 class 文件,同时打包成 jar,虽然有各种工具可以帮助我们,但是毕竟掌握使用 java 本来的命令去做这些更 ...
- UE4新手编程之创建C++项目
虚幻4中常用的按键和快捷键 虚幻4中有一些按键和快捷键很常用,牢记它们并运动到实际的项目开发中,将会大大地提高你的工作效率和使得工作更简便快捷.下面将列举它们出来: 按键 动作 鼠标左键 选 ...
- redis 学习笔记——数据同步、事务
redis主从同步 redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础. redis复制原理 re ...
- Jquery下控制backgroundPosition位置的问题/jquery查找data id相等的元素
1:想通过控制backgroundPosition 来实现动态效果: $(this).animate({"background-positionY":-13},1); //但是火狐 ...
- Josephus问题的不同实现方法与总结
/************************************************************************/ /* Josephus问题--数组实现 */ /* ...
- DB2表是否存在
select count(1) from syscat.tables where tabname='T1';