POJ 1038 Bugs Integrated, Inc. ——状压DP
状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可。
然后转移的时候用搜索找出所有的状态进行转移。
#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define mask(i) ((mask%pow[i+1])/pow[i])
#define a(i) (a[x][i])
int dp[2][500005],pow[20],n,m,k;
int a[205][20],t,now,pre;
void print(int mask)
{F(i,0,m-1)printf("%d",(mask%pow[i+1])/pow[i]);}
void dfs(int x,int y,int mask,int val)
{
// printf("Dfs %d %d %d ",x,y,val); print(mask); printf("\n");getchar();
if (y>=m){dp[pre][mask]=max(val,dp[pre][mask]);return;}
if (y+2<m&&!a(y)&&!a(y+1)&&!a(y+2)&&mask(y)==mask(y+1)&&mask(y+1)==mask(y+2))
{
if (mask(y)==1)
{
// print(mask); printf(" to ");
mask-=pow[y]+pow[y+1]+pow[y+2];
// print(mask); printf("\n");
dfs(x,y+3,mask,val+1);
mask+=pow[y]+pow[y+1]+pow[y+2];
}
else
{
// print(mask); printf(" to ");
mask+=pow[y]+pow[y+1]+pow[y+2];
// print(mask); printf("\n");
dfs(x,y+3,mask,val);
mask-=pow[y]+pow[y+1]+pow[y+2];
}
}
if (y+1<m&&!a(y)&&!a(y+1)&&mask(y)==mask(y+1))
{
if (mask(y)<2)
{
// print(mask); printf(" to ");
mask+=pow[y]+pow[y+1];
// print(mask); printf("\n");
dfs(x,y+2,mask,val);
mask-=pow[y]+pow[y+1];
}
else
{
// print(mask); printf(" to ");
mask-=2*pow[y]+2*pow[y+1];
// print(mask); printf("\n");
dfs(x,y+2,mask,val+1);
mask+=2*pow[y]+2*pow[y+1];
}
}
// printf("%d mask (%d)\n",mask(y),y);
if (!mask(y))
{
dfs(x,y+1,mask,val);
}
}
int main()
{
scanf("%d",&t);
pow[0]=1;
F(i,1,14)pow[i]=pow[i-1]*3;
while (t--)
{
memset(a,0,sizeof a);
scanf("%d%d%d",&n,&m,&k);
F(i,1,k)
{
int x,y;scanf("%d%d",&x,&y);
x--; y--;
a[x][y]=1;
}
F(i,0,m-1) a[n][i]=1;
now=1;pre=0;
memset(dp[pre],-1,sizeof dp[pre]);
dp[pre][0]=0;
F(i,0,n)
{
now^=1; pre^=1;
memset(dp[pre],-1,sizeof dp[pre]); //printf("memset %d\n",pre);
F(j,0,pow[m]-1) if (~dp[now][j])
{
// printf("%d is no ",i); print(j); printf(" == ");printf("%d\n",dp[now][j]);
dfs(i,0,j,dp[now][j]);
}
}
printf("%d\n",dp[pre][0]);
}
}
POJ 1038 Bugs Integrated, Inc. ——状压DP的更多相关文章
- poj1038 Bugs Integrated,Inc. (状压dp)
题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个. 我的方法好像和网上流传的方法不太一样...不管了.... 由数据范围很容易想到状压dp 我们设某个状态的 ...
- POJ1038 Bugs Integrated, Inc 状压DP+优化
(1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
$ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...
- POJ 1038 Bugs Integrated, Inc.
AC通道 神坑的一道题,写了三遍. 两点半开始写的, 第一遍是直接维护两行的二进制.理论上是没问题的,看POJ discuss 上也有人实现了,但是我敲完后准备开始调了.然后就莫名其妙的以为会超时,就 ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- 【POJ 2923】Relocation(状压DP+DP)
题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...
随机推荐
- [总结].net操作MongoDb通用基础类1:
public class MongoDBHelper { //定义Mongo服务 private MongoServer mongo = null; //获取databaseName对应的数据库,不存 ...
- js3
举几个小例子: 1. 九九乘法表 var s = "<table>"; for (var i=1;i<=9;i++) { s += "<tr> ...
- 洛谷 P1330 封锁阳光大学
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- Linux下文件以及文件名编码转换
1.查看文件编码方式--file 文件名(但不是很准确) yang@mint-linux ~ $ file baidu.html baidu.html: HTML document, UTF-8 Un ...
- CPP-基础:运算符重载详解
1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功 ...
- Codeforces Round #277.5 (Div. 2)-C. Given Length and Sum of Digits...
http://codeforces.com/problemset/problem/489/C C. Given Length and Sum of Digits... time limit per t ...
- golang 强制重新全部编译
/home/用户名/.cache 删除缓存试试?? 修改的东西老失败 编译结果总不变 神奇了 go build -a -x -v加一句-a 强制重新编译.
- PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)
PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...
- Bootstrap历练实例:大的按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- rhel7.3smb安装配置
rhel7.3smb安装配置 1.安装 yum -y install samba samba-client cifs-utils 2.配置开机自启动,覆盖原配置文件 systemctl enable ...