POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解
题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子。
思路:我们放置2 * 3格子时可以把状态压缩到三进制:
关于状压:POJ-1038 Bugs Integrated, Inc. (状压+滚动数组+深搜 的动态规划),写的很详细
所以我们直接枚举每一行的所有可能状态,并算出每种状态最大值。这样我们到最后只要找到n行所有状态最大值就行了。
代码:
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
const int MOD = ;
int dp[][], ter[];
int vis[][];
int t, n, m, k;
int now[], pre[];
void getNow(int i){
for(int k = ; k <= m; k++){
if(vis[i][k]){
now[k] = ;
}
else{
if(pre[k] <= ) now[k] = ;
else now[k] = ;
}
}
}
int getSt(){
int ret = ;
for(int k = ; k <= m; k++){
ret = ret * + now[k];
}
return ret;
}
void dfs(int i, int j, int num){
int nowSt; if(j > m){
nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num);
return;
} // ▇ ▇ ▇
// ▇ ▇ ▇
if(j >= && !now[j - ] && !now[j - ] && !now[j]){
now[j - ] = now[j - ] = now[j] = ;
nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num + );
dfs(i, j + , num + );
now[j - ] = now[j - ] = now[j] = ;
} // ▇ ▇
// ▇ ▇
// ▇ ▇
if(j >= && !now[j - ] && !now[j] && !pre[j - ] && !pre[j]){
now[j - ] = now[j] = ;
nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num + );
dfs(i, j + , num + );
now[j - ] = now[j] = ;
} nowSt = getSt();
dp[i % ][nowSt] = max(dp[i % ][nowSt], num);
dfs(i, j + , num);
}
int main(){
ter[] = ;
for(int i = ; i <= ; i++){
ter[i] = ter[i - ] * ;
}
scanf("%d", &t);
while(t--){
scanf("%d%d%d", &n, &m, &k);
memset(vis, , sizeof(vis));
for(int i = ; i <= k; i++){
int x, y;
scanf("%d%d", &x, &y);
vis[x][y] = ;
} //0 都可以,1 上一行不可以,2 都不可以
int temp = ;
for(int i = ; i <= m; i++) temp = temp * + ;
memset(dp[], -, sizeof(dp[]));
dp[][temp] = ;
for(int i = ; i <= n; i++){
memset(dp[i % ], -, sizeof(dp[]));
for(int st = ; st < ter[m]; st++){
if(dp[(i + ) % ][st] == -) continue;
int tmp = st;
for(int j = m; j >= ; j--){
pre[j] = tmp % ;
tmp /= ;
}
getNow(i);
dfs(i, , dp[(i + ) % ][st]);
}
} int Max = -;
for(int i = ; i < ter[m]; i++)
Max = max(Max, dp[n % ][i]);
printf("%d\n", Max);
}
return ;
}
POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解的更多相关文章
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
$ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...
- 三进制状压 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.
AC通道 神坑的一道题,写了三遍. 两点半开始写的, 第一遍是直接维护两行的二进制.理论上是没问题的,看POJ discuss 上也有人实现了,但是我敲完后准备开始调了.然后就莫名其妙的以为会超时,就 ...
- poj 1308Bugs Integrated, Inc. [三进制状压]
题目链接[http://poj.org/problem?id=1038] 题意: 给出一个N*M大小的图,图中有K个坏点.N (1 <= N <= 150), M (1 <= M & ...
- POJ 1038 Bugs Integrated, Inc. ——状压DP
状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可. 然后转移的时候用搜索找出所有的状态进行转移. #include <map> #include < ...
随机推荐
- 牛客练习赛36B
唔在cf上做过,A题也做过,神仙说D题也是原题 这个题就是dp了.然后数组滚动一下,很显然能住遇到 i 只与 i-1 有关,所以还是挺好滚的. dp[i][j][k]表示到第I 天一共工作了J天连续 ...
- web开发——入门篇(上)
作为一名IT届的后生,当初也经历过懵懂无知的实习期,对那种无力感深有体会.在这,希望能用我这几年的开发经验,让各位即将踏入或者刚刚踏入web开发领域的新人们少走些弯路.鉴于这是入门篇,下面我就从零为大 ...
- meat标签
1.文档兼容模式的定义 Edge 模式告诉 IE 以最高级模式渲染文档,也就是任何 IE 版本都以当前版本所支持的最高级标准模式渲染,避免版本升级造成的影响.简单的说,就是什么版本 IE 就用什么版本 ...
- webstorm安装 利用host破解
1.官网下载,一路确定(其中最近一版还下载个什么玩意,不要取消,取消后即使安装了也报错找不到jvm的环境变量), 2 打开webstorm,首次使用前accept -->dont sent - ...
- thinkphp 百度地图Api坐标计算 A坐标距离B坐标多少公里 并按照距离近的排序 坐标排序 外部字段排序
感谢我磊哥 函数封装方法: //计算距离 /* **$a 可多数坐标 就是可数组类型的 ***$b 是登录者的坐标 ***ps: lat经度 lng纬度 经度在前纬度在后 *** ***/ funct ...
- PHP(控制语句,随机数,循环语法)
1.随机数:Math.random():0到1 不包括1 永远取不到2.控制语句if(){} for循环 语法 运行步骤(过程,原理) 1.初始化 2.判断条件 3.变量改变 index:下 ...
- mysql日志分类
mysql的日志分类: (1)错误日志:记录mysql服务的启动,运行,停止mysql服务时出现的问题 [mysqld] log_error=[/path/filename] (2)通用查询日志:记录 ...
- 做一个vue的todolist列表
<template> <div id="app"> <input type="text" v-model="todo&q ...
- Luogu 1071 - 潜伏者 - [字符串]
题目链接:https://www.luogu.org/problemnew/show/P1071 题解: 模拟就完事儿了. 注意failed的情况有:出现一个 $f[x]$ 对应多个值:存在两个不同的 ...
- pytorch实现AlexNet网络
直接上图吧 写网络就像搭积木