首页 > 其他分享 >[NOI2001] 炮兵阵地

[NOI2001] 炮兵阵地

时间:2024-12-07 15:44:25浏览次数:6  
标签:状态 考虑 位置 炮兵阵地 即可 NOI2001 line 转移

算法

看到数据范围很小, 考虑状压 \(\rm{dp}\)

我们考虑从左上往右下推答案, 那么显然的, 我们只需要考虑向上向左方向的冲突情况, 而无需考虑向下向右的

考虑轮廓线 \(\rm{dp}\) , 虽然不太标准就是了

k5qh2z51.png

实际上对于这样的情况, 我们考虑枚举绿色部分是否选择, 然后对状态进行转移

分类讨论

当绿色部分不选择时

这个时候只要之前的状态不冲突, 即状态合法, 都可以转移

具体的, 对于图中的这种情况, 我们可以转移到
g5sgdl19.png

那么状态怎么变化?
具体的, 对于两行, 都只需要把修改那一位的位置更新, 其他的不变即可

当绿色部分选择时

这个时候我们需要确保无冲突情况和无障碍物, 我们只需要确保上方两块和左侧两块上没有炮兵部队即可

这样做, 时间复杂度是 \(\mathcal{O} (nm 2 ^ {2m})\) , 显然是过不去的

考虑到很多状态根本不合法, 根本跑不满, 我们提前判断每种状态的正确性即可预处理出合法状态, 这样可以通过本题

状态转移

根据以上的讨论, 我们尝试写出转移式子

令 \(f_{i, j, line_1, line_2}\) 表示考虑 \((i, j)\) , 当前两行的状态为 \(line_1, line_2\) 时最多放置的部队数量

  • 不选择当前点
    更新 \(line_1\) 的第 \(j\) 位为 \(line_2\) 的第 \(j\) 位, \(line_2\) 的第 \(j\) 位更新为 \(0\)

  • 选择当前点
    首先判断地形, 然后判断 \(line_2\) 的 \(j - 1, j - 2\) 位置, 判断 \(line_1\) 的 \(j\) 位置和 \(line_2\) 的 \(j\) 位置是否都不为 \(1\) , 转移

初始化 \(f_{0, 0, 0, 0} = 0\) , 最后的答案即为 \(\max f_{n - 1, m - 1, line_1, line_2}\)

滚动一下即可

实现

框架

  • 对于每一个位置, 枚举产生符合要求的状态
  • 转移即可

代码

还在调, 后补

总结

状压常见优化

  • 提前把有效状态筛出来, 防止无效的转移

逐一讨论的完整性

状态压缩这样的问题, 一定要想办法简化代码

标签:状态,考虑,位置,炮兵阵地,即可,NOI2001,line,转移
From: https://www.cnblogs.com/YzaCsp/p/18592216

相关文章

  • 题解_P2024 [NOI2001] 食物链
    [NOI2001]食物链题目描述动物王国中有三类动物\(A,B,C\),这三类动物的食物链构成了有趣的环形。\(A\)吃\(B\),\(B\)吃\(C\),\(C\)吃\(A\)。现有\(N\)个动物,以\(1\simN\)编号。每个动物都是\(A,B,C\)中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这......
  • P2024 [NOI2001] 食物链
    原题链接题解关系具有矢量特性,因此可以带权并查集维护code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intfa[50006];intval[50006];intfinds(intnow){if(now==fa[now])returnnow;inttem=fa[now];fa[now]=finds(fa[now])......
  • P2704 [NOI2001] 炮兵阵地
    原题链接题解经典的状压dpcode#include<bits/stdc++.h>#definelllonglong#definelowbit(x)((x)&(-x))usingnamespacestd;intsit[105];intdp[505][505][4];boolcheck(intx){intx1=(x>>1)>>1;intx2=(x<<1)<<1;......
  • P2024 [NOI2001] 食物链
    原题链接题解带权并查集的应用,普通的并查集只能表示结点间的一种关系(如同一集合中的都是朋友)。而带权并查集的结点权值表示该结点与根结点的关系。相对应,带权并查集的路径压缩也复杂了一点。code #include<bits/stdc++.h>usingnamespacestd;constintN=5e4+5;intn,k......
  • P2024 [NOI2001] 食物链
    Solution:使用拓展域并查集,\(1-n\)表示\(\rmA\)群落,\(n+1-2n\)是\(\rmB\)群落,\(2n+1-3n\)是\(\rmC\)群落那么对于操作一,我们首先判断\(x\)是否吃了\(y\)或\(y\)是否吃了\(x\).若吃了,那么这句话为假若没吃,则将(x,y)(x+n,y+n)(x+2n,y+2n)三条边连......
  • poj1185炮兵阵地
    炮兵阵地TimeLimit:2000MS MemoryLimit:65536KTotalSubmissions:43084 Accepted:16457Description司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H"表示),也可能是平原(用"P"表示),如下图。......
  • [NOI2001] 陨石的秘密
    题目描述公元11380年,一颗巨大的陨石坠落在南极。于是,灾难降临了,地球上出现了一系列反常的现象。当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察,科学家们发现陨石上刻有若干行密文,每一行都包含5个整数:11116006357801132845著......
  • P2024 [NOI2001] 食物链
    P2024[NOI2001]食物链法一:种类并查集A->B->C->A[1,n]:表示同类,[n+1,2n]:表示猎物,[2n+1,3*3]:表示天敌点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=5e4+10;intfa[3*N];intfind(intx){ returnx==fa[x]?x:fa[x]=find(fa[x......
  • Ynoi2001 冷たい部屋、一人 题解
    \(\text{link}\),这题太毒瘤啦!难写难调还略微卡常。谁爱卡常谁卡吧。反正我先贺为敬了。——引用自洛谷别人的提交记录本人写了两天(两个\(case\)各一天),调崩溃了才调出来,太毒瘤了!看到颜色相同发现不弱于\(O(n\sqrtn)\),一眼根号分治,设阈值为\(B\)。case1对于颜色出现次......
  • P2024 [NOI2001] 食物链 || #576. 食物链【NOI2001】 (并查集)
    空降锣鼓空降OJ题解:#include<bits/stdc++.h>usingnamespacestd;intn,k;intd,x,y;intans;intfa[500050];intfind(intx){//找爸爸 if(fa[x]==x) returnfa[x]; returnfind(fa[x]);}intmain(){ cin>>n>>k; for(inti=1;i<=n*3;i++)//开三个并查集风......