提莫队长正在待命
Problem:J
Time Limit:2000ms
Memory Limit:65536K
Description
“整装待发!”

遥远的瓦罗兰大陆上,有一座神秘的城池——班德尔城,班德尔城的历史非常悠久,其主要居民都是身高1m左右的约德尔人。而保卫这座城池安全的正是班德尔城最富盛名的特种部队之一“主舰斥候队”。提莫队长正是斥候队的侦查兵首领。凭借一手“致盲吹箭”和久负盛名的“小莫快跑”,提莫队长可攻可守,击退了无数试图进犯班德尔城的敌人。
但是众所周知,真正使他在瓦罗兰大陆上声名鹊起,令无数豪杰闻之而胆颤的是他的蘑菇。
但是因为这是一个算法题,而不是一场故事会。所以你需要帮助提莫队长解决一个困扰了他很久的问题。
给定一个长为n,宽为m的区域。这一片区域上由各种地形组成。其中包括
陆地,用大写字符“L”表示
水面,用大写字符“W”表示
森林,用大写字符“F”表示
城池,用大写字符“C”表示
提莫队长需要在这片区域上布置他的蘑菇来抵御随时可能进犯的敌人。
为了更好的隐蔽他的蘑菇只能被种在森林区域。
并且因为蘑菇存在可能爆炸的风险,所以不能够将一个蘑菇种在另一个蘑菇的爆炸范围内。
同时为了保证城池的安全,每座城池也均不能在蘑菇的爆炸范围内
每一个蘑菇的攻击范围包含其上下左右四个方向和自身共计9个单位区域内。

如图1这样一个区域内,提莫只能在F内种下蘑菇
如图2在(2,3)种下一个蘑菇,红色区域即为蘑菇的攻击范围
(手动分割线)
现在请你帮助提莫队长安排一个最优方案以便在这片区域内能够种下最多的蘑菇,来抵御敌人的入侵,守护班德尔城的安宁
Input
第一行两个整数n,m 1<=n<=100,1<=m<=10
接下来n行为区域的分布,保证不含有除“LWFC”外的任何字符
upd:第六组数据已经修复
出题人诚恳谢罪https://acm.njupt.edu.cn/pb/srz6TT
Output
一个整数,代表提莫队长能够在这片区域内种下的最多的蘑菇
Sample Input
5 4
FLFF
FFLL
FFFF
FLFF
FLLF
Sample Output
6
Hint
请注意本题的时空限制,做适当的优化
#pragma GCC optimize(2)
请给程序在头文件前加上如上的预编译优化指令



#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char district[105][15];
int dp[5][1100][1100]; //到第i行,第i行状态为j,上一行状态为k,同时考虑每一行只与上两行有关所以滚动数组优化
bool chksg[105][1100];
bool chkdual[1100][1100];
int n, m, maxm, ans = 0;
bool chka(int line, int sit) //检查当前行状态是否合法
{//不可以放在除森林以外的任何地方并且需要满足彼此间隔大于等于3int las = -1;for (int i = 0; i < m; i++){if (((sit >> i) & 1) == 1){if (las == -1) //直接更新{las = i;}else{if (i - las < 3){return false;}else{las = i;}}if (district[line][m - i] != 'F'){return false;}}}return true;
}
bool chkb(int down, int up) //检查两行蘑菇之间是否会冲突
{int nt = (up & down);return nt == 0;
}
void init() //预处理情况
{for (int i = 1; i <= n; i++){for (int j = 0; j <= maxm; j++){chksg[i][j] = chka(i, j);}}for (int i = 0; i <= maxm; i++){for (int j = 0; j <= maxm; j++){chkdual[i][j] = chkb(i, j);}}
}
int main()
{//freopen("","r",stdin);//freopen("","w",stdout);cin >> n >> m;maxm = ((1 << m) - 1);for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> district[i][j];}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (district[i][j] == 'C'){for (int p = -2; p <= 2; p++) //考虑将城池的范围直接更改为不可放置即可{if (i + p >= 1 && i + p <= n){district[i + p][j] = 'L';}if (j + p >= 1 && j + p <= m){district[i][j + p] = 'L';}}}}}//预处理chk的情况init();//考虑第一行只要合法就直接放for (int i = 0; i <= maxm; i++){if (chksg[1][i]){dp[1 % 2][i][0] = __builtin_popcount(i);}}//考虑第二行只要不与第一行冲突就可以直接放for (int i = 0; i <= maxm; i++){if (chksg[2][i]){for (int j = 0; j <= maxm; j++){if (chksg[1][j] && chkdual[i][j]){dp[2 % 2][i][j] = dp[1 % 2][j][0] + __builtin_popcount(i);}}}}//之后情况for (int i = 3; i <= n; i++){for (int j = 0; j <= maxm; j++) //枚举当前行情况{if (chksg[i][j]) //检查当前行是否合法{int cnt = (int)__builtin_popcount(j);for (int k = 0; k <= maxm; k++) //枚举上一行情况{if (chksg[i - 1][k] && chkdual[j][k]) //检查上一行状态是否合法并且是否会与当前行冲突{for (int p = 0; p <= maxm; p++) //枚举上上一行情况{if (chkdual[j][p]) //检查上上一行与当前行是否冲突{dp[i % 2][j][k] = max(dp[i % 2][j][k], dp[(i - 1) % 2][k][p] + cnt);if (i == n){ans = max(ans, dp[i % 2][j][k]);}}}}}}}}cout << ans << endl;return 0;
}

提莫队长正在待命(DP)相关推荐

  1. 提莫攻击(提莫队长正在待命)

    问题描述: 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄.他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态. 当提莫攻击艾希,艾希的中毒状态正好持续 d ...

  2. csust2019集训队选拔赛题解

    第一次参加比赛 崩的实在是太惨了.. 只A了一道板子题(已经被自己菜哭了 没想到大家都掉线了 一起崩 这也给了我一个血的教训 以后比赛一定要多开几题 简直是在死撑着坐满五个小时 当时其实老早就想溜了( ...

  3. CSUST选拔赛题解

    ---恢复内容开始--- A:哭泣的阿木木 题目链接:http://csustacm.com:4803/contest/26/problem/J 思路:这是一个很裸的线段树+lazy数组标记,直接用板 ...

  4. 第五次C语言上机实验报告

    目标: 1.拾遗补缺; 2.了解C语言及其语句的更多细节. 任务1提示: 在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值. 例如, in ...

  5. Maven项目集成cxf框架发布WebService

    关于Maven项目集成cxf框架发布和接收WebService 从网上找了很多,发现大多数都是类似"单机"版的发布,直到看了一篇博客,给我很大的启发. 在此感谢这位博客的作者:ht ...

  6. 2020/5/4/ 每日一咕

    2020/5/4 来两道状压dp 1.状压DP 1434. 每个人戴不同帽子的方案数 - 力扣(LeetCode) 总共有 n n n 个人和 40 40 40 种不同的帽子,帽子编号从 1 1 1 ...

  7. 【题解】 小莫踩蘑菇

    题目描述 大家都知道提莫队长喜欢种蘑菇.有一天提莫正走在回约德尔国的路上,忽然看到路上长了很神奇的蘑菇,蘑菇会不断从某处长出来,但是如果不快点(1秒内)采走的话会消失.酷爱蘑菇的提莫马上去采蘑菇.说来 ...

  8. 算法实验二 动态规划

    动态规划1 实验题目:减肥的小K2 题目描述: 小K是个苦命的孩子,他的师傅为了多赚钱,以减肥为理由,让他去采药,并说不完成不能吃饭.野地里有许多不同的草药,采每一株都需要一些时间,每一株也有它自身的 ...

  9. python 爬取图片_使用python爬取英雄联盟官方英雄皮肤图片

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

最新文章

  1. php jquery ajax输出数组吗,jquery – 从PHP返回数组时的Ajax Parse错误
  2. Curator-01
  3. centos nginx不是命令_Nginx 在CentOS 6/7 上的安装与使用
  4. Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单
  5. 10taskkill无法终止进程_?进程的状态转换
  6. real210移植记录-u-boot2013.10引导linux3.10.30进入控制台
  7. 音视频技术开发周刊 | 137
  8. c语言可以将负数强制转换成正数吗_C语言笔记(一、概述)
  9. 53 MM配置-评估和科目设置-定义评估控制
  10. 生成和解析二维码(zxing)
  11. 微电子专业深度盘点:哪所大学芯片最强?强在哪?(第3弹)
  12. 模拟器游戏修改之教你如何修改gba rom里的程序!
  13. 红米6 Pro开启ROOT权限的教程
  14. IntelliJ IDEA的maven如何提高下载速度
  15. 教你用Python如何完成一个查票系统实现123006自动抢票啦~
  16. Maximo 密码加密传送
  17. -20dB谱宽是什么意思?
  18. 2022年「博客之星」 无知的人_的程序人生
  19. 数组按数字出现频次排序
  20. YAGEO(国巨)旧电脑风扇制作风力发电机步骤详解 - 电动机控制电路图

热门文章

  1. 如何在模拟器中测试Windows Phone 8的NFC应用
  2. 如何在Photoshop中更改某人的眼睛颜色
  3. 2、Loust并发测试,将查询结果返回给另一接口
  4. 眼睛有血斑,就是眼底出血?
  5. PPT打开出错/可尝试修复此演示文稿
  6. 福清龙华职业中专计算机应用学校什么,福建省福清龙华职业中专学校招生专业|福建省福清龙华职业中专学校有哪些专业...
  7. 翻译《文件系统取证分析》第13章
  8. windows bat系列9:for处理案例三 单行按指定分隔符分割
  9. Outlook html 图片白色空白,outlook签名设置_解决Outlook中的签名和邮件图片都显示空白的办法_outlook邮件空白...
  10. 精美素材:10套最新出炉的免费扁平图标下载