【CEOI2002】【Poj 1038】Bugs Integrated, Inc.
http://poj.org/problem?id=1038
发一下中文题面(今天考试直接被改了):
生记茶餐厅由于受杀人事件的影响,生意日渐冷清,不得不暂时歇业。四喜赋闲在家,整天抱着零食看电视,在大家的提醒下才开始注意自己日益发福的形象,下定决心减肥,萌发了去工作压力大的电脑公司打工的念头。于是,她应聘到了 Bugs 公司,这是一家专门生产硬件的企业。初来乍到,四喜被分配到车间进行产品组装,工作就是把公司生产的一种 2*3 单位尺寸的芯片嵌入 N*M 单位尺寸的模板内。模板接受过严格检查,损坏的单位小方格已被标上黑色记号,如下图所示。

嵌入芯片的要求是,放置芯片的区域内不能有黑色记号,同时芯片与芯片之间不能重叠。公司为了追求利益,希望将尽量多的芯片嵌入模板,这可难坏了那批工人。四喜向你求助,希望你能帮她计算出可能嵌入的最大芯片数量。
①记忆化搜索
悲剧

怎么改都MLE 。。。只能用map动态开内存,但是常数。。。
状态很小,3^10,记录每个点往下还要扩展几格(三格的直接忽略-直接转到下一层了)
// <bugs-b.cpp> - Thu Oct 20 08:13:16 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is. #include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#pragma GCC push_options
#pragma GCC optimize ("O2")
#define IN inline
#define RG register
using namespace std;
const int MAXN=;
inline int gi() {
register int w=,q=;register char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')q=,ch=getchar();
while(ch>=''&&ch<='')w=w*+ch-'',ch=getchar();
return q?-w:w;
}
int n,m,g[MAXN][],mul[],a[];
map<int,int>f[MAXN];map<int,bool>u[MAXN];
IN int dfs(RG int d){
if(d==n+)return ;
int s=;
for(int i=;i<=m;i++)s+=mul[i]*a[i];
if(u[d][s])return f[d][s];u[d][s]=;
struct kai{
int d,c,b[];
IN void work(int x,int o){
for(int i=x;i<=m;i++)if(a[i])a[i]--;
c=max(c,dfs(d+)+o);//this
for(int i=x;i<=m;i++)a[i]=b[i];
if(x>m)return;
for(int i=x;i<m;i++){
if(d<n&&a[i]==&&a[i+]==&&!g[d][i]&&!g[d][i+]&&!g[d+][i]&&!g[d+][i+]){
if(d<=n-&&!g[d+][i]&&!g[d+][i+]){
a[i]=a[i+]=;//this
work(i+,o+);
a[i]=a[i+]=;
}
if(i<m-&&a[i+]==&&!g[d][i+]&&!g[d+][i+]){
a[i]=a[i+]=a[i+]=;//this
work(i+,o+);
a[i]=a[i+]=a[i+]=;
}
}
if(a[i])a[i]--;
}for(int i=x;i<=m;i++)a[i]=b[i];
}
void pre(int x){
c=;d=x;for(int i=;i<=m;i++)b[i]=a[i];
}
}e;e.pre(d);e.work(,);
return f[d][s]=e.c;
}
int main()
{
int T=gi();
while(T--){
for(int i=;i<MAXN;i++)
f[i].clear(),u[i].clear();
memset(g,,sizeof(g));
n=gi(),m=gi();int k=gi();
for(int i=;i<=k;i++)g[gi()][gi()]=;
mul[]=;for(int i=;i<=m;i++)mul[i]=mul[i-]*;
printf("%d\n",dfs());
}
return ;
}
吐槽:POJ居然卡空间,不得不用map(十倍常数)用数组0.03s就过了今天考试~~表示愤怒,我还是要把我的MLE的代码蒯上.(跑得比状压dp快)
// <bugs-s.cpp> - Thu Oct 20 08:13:16 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is. #include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#pragma GCC push_options
#pragma GCC optimize ("O2")
#define IN inline
#define RG register
using namespace std;
const int MAXN=;
const int MAXM=;
inline int gi() {
register int w=,q=;register char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')q=,ch=getchar();
while(ch>=''&&ch<='')w=w*+ch-'',ch=getchar();
return q?-w:w;
}
int n,m,g[MAXN][],mul[],a[];
int f[MAXN][MAXM];bool u[MAXN][MAXM];
IN int dfs(RG int d){
if(d==n+)return ;
int s=;
for(int i=;i<=m;i++)s+=mul[i]*a[i];
if(u[d][s])return f[d][s];u[d][s]=;
struct kai{
int d,c,b[];
IN void work(int x,int o){
for(int i=x;i<=m;i++)if(a[i])a[i]--;
c=max(c,dfs(d+)+o);//this
for(int i=x;i<=m;i++)a[i]=b[i];
if(x>m)return;
for(int i=x;i<m;i++){
if(d<n&&a[i]==&&a[i+]==&&!g[d][i]&&!g[d][i+]&&!g[d+][i]&&!g[d+][i+]){
if(d<=n-&&!g[d+][i]&&!g[d+][i+]){
a[i]=a[i+]=;//this
work(i+,o+);
a[i]=a[i+]=;
}
if(i<m-&&a[i+]==&&!g[d][i+]&&!g[d+][i+]){
a[i]=a[i+]=a[i+]=;//this
work(i+,o+);
a[i]=a[i+]=a[i+]=;
}
}
if(a[i])a[i]--;
}for(int i=x;i<=m;i++)a[i]=b[i];
}
void pre(int x){
c=;d=x;for(int i=;i<=m;i++)b[i]=a[i];
}
}e;e.pre(d);e.work(,);
return f[d][s]=e.c;
}
int main()
{
freopen("bugs.in","r",stdin);
freopen("bugs.out","w",stdout);
int T=gi();
while(T--){
memset(f,,sizeof(f));
memset(u,,sizeof(u));
memset(g,,sizeof(g));
n=gi(),m=gi();int k=gi();
for(int i=;i<=k;i++)g[gi()][gi()]=;
mul[]=;for(int i=;i<=m;i++)mul[i]=mul[i-]*;
printf("%d\n",dfs());
}
return ;
}
②状压DP
YZC今天给我讲了一下思路,第一行和第二行的状态一定是一样的,关键第三行,开两个数组分别记录第一行和第三行
挖坑待填~(有时间再写)
【CEOI2002】【Poj 1038】Bugs Integrated, Inc.的更多相关文章
- 【POJ 2096】 Collecting Bugs
[题目链接] http://poj.org/problem?id=2096 [算法] 概率DP [代码] #include <algorithm> #include <bitset& ...
- 【POJ 2096】Collecting Bugs 概率期望dp
题意 有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n. 求他找到s个系统的bug,n种bug, ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
- BZOJ2296: 【POJ Challenge】随机种子
2296: [POJ Challenge]随机种子 Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 114 Solv ...
随机推荐
- 【spring】jar包详解与模块依赖关系
以spring3.X为例 jar包详解 1. spring-core.jar:包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心: 2. spri ...
- [Python3网络爬虫开发实战] 1.9.1-Docker的安装
Docker是一种容器技术,可以将应用和环境等进行打包,形成一个独立的.类似于iOS的App形式的“应用”.这个应用可以直接被分发到任意一个支持Docker的环境中,通过简单的命令即可启动运行.Doc ...
- 树莓派--bcm2835 library (2) 交叉编译BCM2835
在上文中,按照guide, 在树莓派目标板上install bcm2835. 因为bcm2835是用户空间应用,所以可以在宿主机上交叉编译,生成binary后在树莓派执行 按照guide: Insta ...
- Django之模板引擎(母版)
Django之模板引擎(母版) 母版:存放所有页面的基本信息,基本样式 子班:继承母版 自定义当前页面私有的样式信息 母版的样式: {% block xxx(名称) %} xxxxxxx(数据) {% ...
- Git和SVN共存的方法
刚工作的时候都是用的cvs和svn,对git不熟悉,随着工作的需要,打分支和版本管理的需要,熟悉起来了git,这一用不可收拾,比svn远远好用,尤其是版本分支管理上,切换分支的方便性,现在这家公司还是 ...
- MySQL数据库:SQL语句基础、库操作、表操作、数据类型、约束条件、表之间的关系
数据库相关概念: 1. 数据库服务器:运行数据库管理软件的计算机 2. 数据库管理软件:MySQL.Oracle.db2.slqserver 3. 库:文件夹,用来组织文件/表 4. 表:文件(类似于 ...
- tyvj1031 热浪
背景 USACO OCT09 9TH 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先 ...
- 找宝箱 (bfs)
Problem Description 作为一个强迫症患者,小 Y 在走游戏里的迷宫时一定要把所有的宝箱收集齐才肯罢休.现在给你一个 N *M 的迷宫,里面有障碍.空地和宝箱,小 Y 在某个起始点,每 ...
- SPOJ SUMPRO(数学)
题意: 给出一个数N,问所有满足n/x=y(此处为整除)的所有x*y的总和是多少.对答案mod(1e9+7). 1 <= T <= 500. 1 <= N <= 1e9. 分析 ...
- mysql常用jar包
连接Mysql数据库: 常用的连接池有两种 DBCP连接池 C3P0连接池 Apache的commons组件 -- DBCP连接池: commons-dbutils-1.4.jar 封装并简化了JDB ...