poj 1038 状态压缩

POJ1039-Pipe 北大POJ1039-Pipe 解题报告+AC代码 立即下载

这道题还是比较基础的状态压缩dp,但有几个点还是要去注意一下,注意点代码的注释中已经给出来了。

//poj 1038 状态压缩dp
#include<stdio.h>
#include<cstdlib>
#include<istream>
#include<algorithm>
#include<vector>
#include<string.h>
#define mod 105225319
#define maxn 100000
using namespace std;
int dp[3][maxn];                          //0:表示前两个都没有;1:表示前第二个有,前一个没有:2:表示前一个有。
int N,M,K,man=1,map[165][15];

int cal(int q[])
{
   int i,j=1,ans=0;
   for(i=1;i<=M;i++)
   {
       ans+=max(q[i]-1,0)*j;
       j*=3;
   }
   return ans;
}

void transform_(int sta,int f[])
{
    int i,j=1;
    for(i=2;i<=M;i++)
        j*=3;
    for(i=1;i<=M;i++)
    {
       f[M-i+1]=sta/j;
       sta=sta%j;
       j/=3;
    }
    return;
}

void dfs(int row,int cow,int q[],int cnt)                       //注意这里的状态转移不能直接用dp[]=dp[]来进行,因为不满足后效性,因为搜索并不是按0-n的顺序进行的,因此dp[i]的值未必会是最终的值,在后面会发生改变。
{
    if(cow-1>M)                             
        return;
    int tt=cal(q);
    int qq[20];
    memset(qq,0,sizeof(qq));
    dp[row%2][tt]=max(dp[row%2][tt],cnt);
    dfs(row,cow+1,q,cnt);
    if(q[cow]==0&&q[cow+1]==0&&cow+1<=M&&!map[row][cow]&&row>=3&&!map[row][cow+1]&&!map[row-1][cow]&&!map[row-1][cow+1]&&!map[row-2][cow]&&!map[row-2][cow+1])
    {
        for(int i=1;i<=15;i++)
            qq[i]=q[i];
        qq[cow]=qq[cow+1]=3;
        dfs(row,cow+2,qq,cnt+1);
        memset(qq,0,sizeof(qq));
    }
    if(q[cow]<=1&&q[cow+1]<=1&&q[cow+2]<=1&&cow+2<=M&&row>=2&&!map[row-1][cow]&&!map[row-1][cow+1]&&!map[row-1][cow+2]&&!map[row][cow]&&!map[row][cow+1]&&!map[row][cow+2])
    {
        for(int i=1;i<=20;i++)
            qq[i]=q[i];
        qq[cow]=qq[cow+1]=qq[cow+2]=3;
        dfs(row,cow+3,qq,cnt+1);
        memset(qq,0,sizeof(qq));
    }
    return;
}

int main()
{
	int T, TT = 1;
	//freopen("d:\\in.txt","r",stdin);
	//freopen("d:\\inn.txt","w",stdout);
    scanf("%d",&T);
    while(T)
    {
       scanf("%d%d%d",&N,&M,&K);
       int i;
       memset(map,0,sizeof(map));
       memset(dp,-1,sizeof(dp));
       for(i=1;i<=K;i++)
       {
           int x,y;
           scanf("%d%d",&x,&y);
           map[x][y]=1;
       }
       man=1;
       for(i=1;i<=M;i++)
          man*=3;
       for(i=0;i<=man;i++)
        dp[0][i]=-1;
       dp[0][man-1]=0;
       for(i=1;i<=N;i++)
       {
            for(int jj=0;jj<=man;jj++)
                dp[i%2][jj]=-1;
           for(int s=0;s<man;s++)
           {
               if(dp[(i+1)%2][s]==-1)
                continue;
               int ds[20];
               memset(ds,0,sizeof(ds));
               transform_(s,ds);
              //printf("s=%d   i=%d\n",s,i);
               dfs(i,1,ds,dp[(i+1)%2][s]);
           }
       }
       int answ=0;
       for(i=0;i<man;i++)
           answ=max(dp[N%2][i],answ);
       printf("%d\n",answ);
       T--;
    }
	return 0;
}

POJ1038--Bugs Integrated POJ 1038--Bugs Integrated 立即下载

相关推荐

Linux磁盘扩容实战:用parted命令无损扩展/data分区(附常见报错解决方案)

本文详细介绍了在Linux生产环境中使用parted命令对已挂载的/data分区进行在线磁盘扩容的完整实战流程。通过风险评估、状态检查、parted工具深度解析及实战演练,指导用户安全完成动态扩容,并提供了常见报错如'Partition is being used'、MBR 2TB限制等的解决方案,确保业务不中断、数据不丢失。

weixin_29207439的博客 296

poj1038(状态压缩)

1.资料请参考刘汝佳黑书139页,注意行和列是反的,还有Qi=Pi-1(Pi>0) ,Qi=0 (Pi=0)这个转移是在不考虑当前行的芯片放置的转移,还有3种情况的描述好像有问题,最后是和队友一同讨论形成自己的思路,其实这三种情况大家自己去考虑一下应该也是好理解的。 2

ysjjovo的专栏 1470

SkyWalking跨线程Trace传递实战:手把手教你用RunnableWrapper解决异步链路中断问题

本文深入解析了SkyWalking在异步编程场景下链路追踪中断的根源,并提供了使用RunnableWrapper等官方包装类的实战解决方案。通过详细的原理解析和代码示例,手把手指导开发者如何实现跨线程的Trace传递,确保分布式系统监控链路的完整性,有效解决异步任务导致的链路中断问题。

sand8的博客 493

poj 1038 三进制状态压缩dp

跟1185思路一样,不过内存限制比较严格,需要用滚动数组 #include <cstdio> #include <iostream> #include <iomanip> #include <string> #include <cstdlib> #include <cstring> #include <queue> #include <set> #include <vector> #include &

Fawkess的博客 296

Disk Drill 使用教程

Disk Drill只需单击几下,即可恢复USB闪存驱动器上已删除的数据,包括丢失的照片,文档和其他文件类型。Disk Drill是真正的多合一应用程序,可在Mac上恢复闪存驱动器。Disk Drill将自动应用最佳的笔式驱动器恢复算法来恢复Mac数据。 USB闪存驱动器是一种传输和存储信息的好方法,但是如果错误地丢失或删除了存储在其中的文件,会发生什么呢?当您需要Mac的闪存驱动器数据恢复软件时,Disk Drill是您的最佳选择。Disk Drill将扫描您的USB闪存驱动器(也称为笔式驱动器)并查找

zjj778899的博客 1万+

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 201

POJ--1038--Bugs Integrated, Inc.--状态DP

硬着头皮写了两天,下面把思路复述一下: 一:状态的表示: 对于每一行来说,a[x]={0,1,2};分别表示格点x的上方有{0,1,2}个空格可用。和黑书的不一样,我觉得这样表示比较方便直观一点就这样表示了。 然后对于每一行可看做是一个三进制的数字,再把这个三进制数转换成十进制数字,从而实现状态压缩存储的目的。 二:dp 数组的表示:dp[i][j] 表示从第i-1行的任意状态得到的第i行

WoniuGe 653

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,

KJ.JK 1071

poj 1038 - Bugs Integrated, Inc.(状态压缩dp)

题意:     从n*m的矩阵中裁剪2*3的小矩形,其中有些方块不能用【题目以坐标方式给出】,问最多可以得到多少小矩形。 思路:       要知道能否以当前行作为小矩形的最后一行,需要知道以上三行的状态信息,因为我们切割的时候可以横着也可以竖着。     同时由于一旦 方格 (x-1, y)被黑色记号或其他芯片占据,则方格(x-2,y)即便空闲对第 x行芯片的放置也毫无意义,

稻草人 1492

TRON 主网节点搭建-2024最新详细版文档

TRON主网节点搭建以前,大概说明一下本次使用的服务器配置,本次从搭建部署到节点完成同步的时间大约为36小时。

J_Lee 4056

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

POJ 1038 状压DP

http://poj.org/problem?id=1038 #include&lt;cstdio&gt; #include&lt;cstring&gt; int const N=200; int const M=20; int map[N][M]; int bin[12]; int p[20],p1[20],p2[20],p3[20],p4[20],n,m,k,f1[60000],f2...

Elijahqi 232

IEC 104电力规约详细解读(一) - 报文结构、报文分类、ASDU

比如,双方可以按频率发送,比如接收8帧I帧回答一帧S帧,也可以要求接收1帧I帧就应答1帧S帧,当然也可以不要求(S帧内容示例参考例1)。所以U帧格式的控制欲第一个字节就只有6种情况,分别是0x83(TESTER确认)、0x43(TESTER命令)、0x23(STOPDT确认)、0x13(STOPDT命令)、0x0B(START确认)、0x07(START命令)ASDU(应用服务数据单元),协议原文格式最好去101协议去看看,会比较详细。遥信、遥测、遥控、遥调、总召、对时等都需要使用I格式传送。

张二狗的博客 1万+

poj1038Bugs Integrated, Inc.【三进制状态压缩】

本来是看这个题是课件上推荐的题当中AC率最高的,结果还看了两天才看明白T^T,三进制状态压缩,什么鬼东西,一个DP居然还要100行代码,太不像话了== 参考博客:http://www.cnblogs.com/vongang/archive/2012/07/30/2615322.html    http://www.cnblogs.com/yefeng1627/archive/2013/01/15

MissZhou要努力 1478

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Poj1038 Bugs Integrated, Inc.【状态压缩DP】

http://poj.org/problem?id=1038 题目大意:一个生产芯片的工厂要生产一种规格为2×3的芯片,方法是先生产一块规格为n×m的矩形硅片,由n×m个正方形方块组成,但是硅片上存在一些损坏的方块,显示为黑色,他们不能用来制作芯片。现在给出硅片上每个损坏方块的位置,求用该硅片最多能切割出多少块芯片。 要知道能否在第k-2行至第k行这三行中切割出芯片及切割出多少芯片,需要知...

weixin_30532369的博客 72

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

poj 1038 Bugs Integrated, Inc.(动态规划状态压缩)

//poj 1038 Bugs Integrated, Inc.(动态规划状态压缩) #include #include #include using namespace std; const int N=160; const int M=15; int sta[12]={0,1,3,9,27,81,243,729,2187,6561,19683,59049}; int dp[2][60000];

u014068781的专栏 487

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

poj 1038 状态压缩dp

还在调试 #include #include #include #include using namespace std; int pow[11] = { 1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049 }; int maps[160][11]; int N, M, K; int dp[2][60000]; int nowstat

马德里小铁匠的铁匠铺 1173

POJ 1038

POJ 1038 尼玛死,卡了1个星期,对状态压缩的精髓终于摸索到那么一点了,黑书例题,思路什么的都有了,我也是按照思路打出来的,惭愧,其实复杂度已经够了,没有剪枝,无限TLE了。不过还是搞出来了,道路那么曲折啊,不知道我的大学生涯能不能撑到我找到出口。 #include #include #include #include #include #include #include #includ

rssj_chlh的专栏 752

poj 1038 状态压缩dp 四进制压缩

黑书上的牛逼题 状态压缩,每个格子有0,1,2三种状态。0表示这个格子为空,1表示这个格子到下一行为空。2表示这个格子到下下一行为空。 如果以(x,y)这个格子为左上角放2*3的矩形,则(x,y)=(x,y+1)=(x+1,y)=(x+1,y+1)=(x+2,y)=(x+2,y+1)=2。 如果以(x,y)这个格子为左上角放3*2的矩形,则(x,y)=(x,y+1)=(x,y+2)=(x+1

AChunter的专栏 1259

POJ 1038 状态压缩dp

Bugs Integrated, Inc. Time Limit: 15000MS   Memory Limit: 30000K Total Submissions: 8763   Accepted: 3352 Case Time Limit: 5000MS Description Bugs Integrated, Inc. is

_rabbit的专栏 1135

POJ1038 Bugs Integrated, Inc.

题目来源:http://poj.org/problem?id=1038 题目大意:   有一家芯片公司要在一块N*M的板子上嵌入芯片,其中1<=N<=150, 1<=M<=10,但是板子上有一些格子是坏的,不能放置芯片。芯片的面积是2*3,可以横着放也可以竖着放,但不能有重叠。如下图所示: 现给出N M和坏点的坐标,求最多能在板子上嵌入多少芯片。 输入:第一行测...

weixin_30236595的博客 128

poj 1038 Bugs Integrated, Inc. 状态压缩dp

//poj 1038 #include using namespace std; int n,m,k,x,y,ans,o; int map[180][16],f[2][60000],three[16],p[16],q[16]; void init() { three[0]=1; for(int i=1;i<=11;++i) three[i]=three[i-1]*3; } int

sepNINE的专栏 473

POJ 1038(状态压缩DP)

Bugs Integrated, Inc. Time Limit: 15000MS   Memory Limit: 30000K Total Submissions: 10080   Accepted: 3884 Case Time Limit: 5000MS Description Bugs Integrated, Inc.

know_heng的博客 535

POJ 1038 Bugs Integrated, Inc. 状态压缩DP

题目来源:1038 Bugs Integrated, Inc. 题意:最多能放多少个2*3的矩形 思路:状态压缩DP啊 初学 看着大牛的代码搞下来的  总算搞懂了 接下来会更轻松吧 3进制代表前2行的状态(i行和i-1行)1代表i-1行占位 2代表i行占位 i-1不管有没有占位都不会影响的0代表i行和i-1行都空闲 然后枚举状态dfs更新状态 话说就不能没写深搜了 有点不会了 #incl

嗯。 1560

poj 1038 Bugs Integrated, Inc.三进制状压dp

http://poj.org/problem?id=1038 这题废了我n长时间 先把图片旋转下M为横轴N为纵轴 发现题目要求放2x3的方块,所以至少要存三行的状态,考虑三进制状压。 讨论状态 对于(x,y)(x,y)(x,y)每一个三进制为 0:(x,y),(x,y−1)0:(x,y),(x,y-1)0:(x,y),(x,y−1)都没有被占用 1:(x,y)1:(x,y)1:(x,y)没有占用...

wty的博客 277
上一篇: hdu 5555 状态压缩dp
下一篇: Codeforces Round #338 (Div. 2) C. Running Track (dp)
labrother
博客等级 码龄11年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值