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

[NOI2001] 炮兵阵地

时间:2024-10-11 14:45:24浏览次数:1  
标签:ch NOI2001 int 炮兵阵地 选取 num && define

原题链接
\(这道题运用到了状态压缩dp的知识\)
\(主要作用为使用二进制中的!(i&i>>1)来表示左右一个是否能够互相攻击到 !(i&i>>2)来表示左右两格能否攻击到\)
\(对于上下的两格 我们考虑维护一个f[i][a][b] i表示当前为第几行 a表示第二行的数 b表示第一行的数\)
\(对于每个f[i][a][b]=max(f[i][a][b],f[i-1][b][c]+num[s[a]])num[s[a]]代表当前行选取a能获得的数!\)
\(f[i-1][b][c]代表上一行选取 b c获得的最大值\)
\(判断能否选取的条件为\)
\(!(s[a]&s[b])&&!(s[a]&s[c])&&!(s[b]&s[c])&&(g[i]&s[a])==s[a]&&(g[i-1]&s[b])==s[b]\)
\(简单操作就不多赘述了\)
\(code:\)

点击查看代码
#include<bits/stdc++.h>

#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>

const int N=110,M=1<<10;
int n,m;
int g[N];
int cnt;
vector<int>s;
int num[M];
int f[N][M][M];
void solve() {
    cin>>n>>m;
//    vector ch(n+1,vector<char>(m+1));
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            char ch;
            cin>>ch;
            if(ch=='P')g[i]|=1<<(m-j-1);
        }
    }
    for(int i=0;i<(1<<m);i++){
        if(!(i&i>>1)&&!(i&i>>2)){
            s.pb(i);
            for(int j=0;j<m;j++){
                num[i]+=(i>>j)&1;
            }
        }
    }
    cnt=s.size();
    for(int i=1;i<=n+2;i++){
        for(int a=0;a<cnt;a++){
            for(int b=0;b<cnt;b++){
                for(int c=0;c<cnt;c++){
                    if(!(s[a]&s[b])&&!(s[a]&s[c])&&!(s[b]&s[c])&&(g[i]&s[a])==s[a]&&(g[i-1]&s[b])==s[b]){
                        f[i][a][b]=max(f[i][a][b],f[i-1][b][c]+num[s[a]]);
                    }
                }
            }
        }
    }
    cout<<f[n+2][0][0];
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int _=1;
//    cin>>_;
    while(_--);
    solve();
}

标签:ch,NOI2001,int,炮兵阵地,选取,num,&&,define
From: https://www.cnblogs.com/archer233/p/18458341

相关文章

  • 题解_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++)//开三个并查集风......