题外话

本人第一次写文章,有写的不好的地方请提出,关于文章内容有什么不懂的也可以问我!
~~大佬及虐菜人士请自觉离开 (小声BB:这应该是全CSDN第一篇炸弹超人题解吧?)

题目描述

有一块矩形游戏场地,场地被分成 NxM 的网格(4N<100,4M<10)其中一部分小方格是水域,另一部分小方格是陆地。
为防御敌军攻击,玩家需要在游戏场地安置炸弹:
1.炸弹只能安置在陆地上;
2.每颗炸弹爆炸后,可以波及到炸弹所在的小方格,及相邻的上、下、左、右小方格;
3.任意两颗炸弹爆炸后不能波及到同一个小方格
请帮助玩家计算出如何安置炸弹,可以使炸弹波及到的范围最大,输出最多可以波及到的小方格数量。
例如:N=4,M=4,网格中水域和陆地的情况如图1所示:

图中,蓝色区域代表水域,绿色区域代表陆地:
安置炸弹的最优方案之一如图2所示;
炸弹波及的范围如图3所示(黑色区域);
这块 4x4 的矩形游戏场地最多可以波及到 11个小方格,其他方案都不会优于这个结果。

输入

第一行输入两个正整数 N和M (4<N<100,4<M<10)
分别表示网格的行数和列数,两个正整数之间以一个空格隔开
接下来输入N行,每行 M 个字符 (字符只能是大写字母 A或 B),
A 表示水域,B表示陆地,字符之间以一个空格隔开

输出

输出一个整数,表示最多可以波及到的小方格数量

样例

样例输入:
44
BAAA
ABAB
BABB
ABAA
样例输出 :
11

题目分析

重点分析:
因为两个炸弹不能波及到同一个方格,所以一个炸弹能够占据的方格是?

且炸弹只能放在陆地上,而且要合法.
注:(算波及格子数时别忘记判断是否越界) *(血与泪的教训 *

所以,这是一道数据很狗的题目
大家拿到这题刚开始按之前选拔赛的标准肯定和我当时一样,觉得直接暴力枚举+搜索即可(骗分大法好
但是,这题会爆内存:

dfs,bfs? -不能AC!
普通dp? -炸裂开来???
状压dp? -也还不够???!!!
那该咋整????????????????

答:做状压dp的优化

逻辑框架和具体实现

这题我们可以用二进制来标记该位置是否为水域*(0是陆地,1是水)*
是否安装过炸弹同理*(1安装过了,0没有)*
所以,记录该位置是否为水域为G[i],该位置是否安装过为S[i],
知识点:“与”运算(&)和“移位”(<<和>>)

这里有个小知识点:二进制中的常规运算
这里就不细讲了,具体可以看:基础二进制运算
就是用来判断是否合题意:
当G[i]&s[i]=0时就会符合题意,反之则不符
关于是否合法,只需要保证一开始那张图标记的红色方格上没有炸弹即可

即不能有相邻“1”的间隔 < 2格(s&s>>1=0,s&s>>2=0
且相邻3行不冲突(设第i,i-1,i-2行状态为a,b,c;只需a&b,a&c,b&c都为0即可)

状态定义

dp[i][j][k]:第i行炸弹安装状态为j,且第i-1行的状态为k,能波及到的最大格子数
cnt(i,s)函数:在第i行状态为s的情况下,有多少新添的炸毁格子数
则很容易推出和背包问题类似的状态转移方程:dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][u]+cnt(i,s))
==优化原因:如果不优化,时间复杂度为O(Nx2的2M次方),会炸,所以只能搞滚动数组
==

上代码

#include<iostream>
#include<vector>
using namespace std;const int N=110,M=1<<10;
int n,m;
int g[N],cnt[M],dp[2][N][M];
vector<int>s,h[M];//判断条件:
bool istrue(int s){return!(s&s>>1||s&s>>2);
}
bool istrue2(int s){return s&s>>1;
}
int cntl(int x,int s){int cnt=0;int flag=0;for(int i=0;i<=m;i++){if(s>>i&1){flag=1;if(x-1>=1)cnt++;if(x+1>=n)cnt++;if(x-1>=0)cnt++;if(x+1>=m)cnt++;}}return cnt+flag;
}int main(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=0;j<m;j++){char x;cin>>x;if(x=='A') g[i]+=1<<j;}}for(int i=0;i<1<<m;i++){if(check(i)) s.push_back(i);//找出合法的状态}for(int i=1;i<=n+2;i++){for(int j=0;j<s.size();j++){//ifor(int k=0;k<s.size();k++){//i-1for(int u=0;u<s.size();u++){//i-2int a=s[u];int b=s[k];int c=s[i];//前面说的,用a,b,c表示三行状态if((a%b)||(b&c)||(a&c)) continue;if((g[i]&c||g[i-1]&b)) continue;if(istrue2(a|b)) continue;int cnt=i<=n/cnt1(i,c):0;dp[i&1][j][k]=max(dp[i&1][j][k],dp[i-1&1][k][u]+cnt);}}}}cout<<f[n+2&1][0][0]<<endl;return 0;
}

-2023年4月15日

简易炸弹超人 题解(蓝桥杯中级组2023选拔赛)相关推荐

  1. 第十二届蓝桥杯青少年组国赛C++中级组 第1题 -- 第3题(python3实现)

    12届蓝桥杯青少年组国赛C++中级组编程题 12届蓝桥杯青少年组国赛C++中级组编程题_lybc2019的博客-CSDN博客 蓝桥杯算法学习路线 | 全程制作过程公开 蓝桥杯算法学习路线 | 全程制作 ...

  2. 2018年蓝桥杯A组C/C++决赛题解

    2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...

  3. 青少年蓝桥杯python组(STEMA中级组)

    STEMA中级-青少年蓝桥杯python组 第一套编程题 第一题 第二题 第三题 第四题 第五题 第二套编程题 第一题 第二题 第三题 第四题 第五题 第一套编程题 第一题 [编程实现] 输入一个字符 ...

  4. 2021第十二届蓝桥杯Python组国赛/决赛 题解

    2021第十二届蓝桥杯Python组国赛/决赛 题解 前言 2021年第十二届蓝桥杯国赛/决赛,因为疫情原因没有像往年一样前往北京参赛,而是在自己学校的机房进行考试,形式上类似蓝桥杯省赛,但由于参加国 ...

  5. 【2021年蓝桥杯Java-B组国赛题解】

    2021年蓝桥杯Java-B组国赛

  6. AcWing蓝桥杯AB组辅导课07、贪心

    文章目录 前言 一.贪心 模板题 例题1:AcWing 104. 货仓选址(贪心,简单,算法竞赛进阶指南) 分析 题解:贪心思路 例题 例题1:AcWing 1055. 股票买卖 II(贪心.状态机, ...

  7. 第十二届 2021年1月 蓝桥杯青少年组省赛C++组 第1题--第3题(scratch实现)

    第十二届2021年蓝桥杯青少年组省赛 第十二届2021年蓝桥杯青少年组省赛_lybc2019的博客-CSDN博客 第十二届蓝桥杯青少年组省赛C++中级组试卷讲解(2021.01) 第十二届蓝桥杯青少年 ...

  8. 第十二届 2021年1月 蓝桥杯青少年组省赛C++组 第1题--第3题(python3实现)

    第十二届2021年蓝桥杯青少年组省赛 第十二届2021年蓝桥杯青少年组省赛_lybc2019的博客-CSDN博客 第十二届蓝桥杯青少年组省赛C++中级组试卷讲解(2021.01) 第十二届蓝桥杯青少年 ...

  9. 2020十月蓝桥杯B组省赛

    2020十月蓝桥杯B组省赛 蓝桥的背景 试题 A: 门牌制作 试题 B: 既约分数 试题 C: 蛇形填数 试题 D: 跑步锻炼 试题 E: 七段码 试题 F: 成绩统计 结束赠言: 既然选择了远方,何 ...

最新文章

  1. ElasticSearch(3)-安装kibana
  2. 求职必备技能:教你如何扒了公司的底裤!
  3. 对比学习系列论文MoCo v1(二):Momentum Contrast for Unsupervised Visual Representation Learning
  4. Android数据存储之GreenDao 3.0 详解
  5. Arcgis for javascript不同的状态下自定义鼠标样式
  6. 10款经典的web前端特效的预览及源码
  7. 5个学习Linux命令站点推荐
  8. 字典树从第i个构造HDU2846
  9. 使用实体框架核心创建简单的审计跟踪
  10. PAGE:像Visual Studio一样设计Python GUI窗体
  11. 让Win让Win XP自动维护系统 自动维护系统
  12. 在浏览器中将表格导入到本地的EXCEL文件,注意控制内存
  13. CEBX格式的文档如何转换为PDF格式文档、DOCX文档?
  14. 傻瓜攻略(十九)——MATLAB实现SVM多分类
  15. Excel做题记录——整数规划优化模型
  16. Cisco PT 案例五:VLAN(Trunk模式实践)
  17. Idea Module not specified
  18. 可以使用ActualHeight来判断textblock是否已经trimming
  19. 华为云Ubuntu16.04更新包管理工具卡住 0% [Connecting to archive.ubuntu.com (91.189.88.152)]
  20. python中用sympy对变量求偏导

热门文章

  1. WechatSpellbook学习笔记
  2. mysql 参数 分隔符_mysqldump命令备份多个数据库时,参数之间分隔符是
  3. 拉取maven项目如何跑起来
  4. GitHub上最励志的计算机自学教程(重制版)
  5. http://bbs.csdn.net/topics/392028373
  6. 论文阅读——INSIDER:Designing In-Storage Computing System for Emerging High-Performance Drive
  7. win10系统关闭哪些服务器,win10.1系统哪些服务可以关闭掉?
  8. windows7交互式服务检测如何禁用?
  9. 午夜与element-ui邂逅
  10. c语言双目运算和单目运算符,单目运算符 双目运算符 三目运算符