POJ1185炮兵阵地(状态压缩 + dp)
题目链接
题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮
能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一行与前面两个相邻的情况,然后在除去与上面两行相邻的情况,因为涉及前面两行所以多设一维状态
dp[i][j][k]表示 第 i 行 状态为k时,第i - 1行状态为j,
那么dp[i][j][k] = max ( dp[i][j][k], dp[i - 1][t][j] + num[k]); num[k]表示第i行可以放多少门大炮,也就是k状态下1的个数
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int state[200], num[200]; int cur[110]; char g[110][20]; int dp[110][200][200]; int n, m, top, total; inline bool is_ok(int x) {if (x & (x << 1))return 0;if (x & (x << 2))return 0;return 1; } int jcount(int x) {int cnt = 0;for (int i = 0; i < 12; i++)if (x & (1 << i))cnt++;return cnt; } int fit(int x, int i) {if (x & cur[i])return 0;return 1; } void init() {top = 0;total = 1 << m;for (int i = 0; i < total; i++){if (is_ok(i))state[++top] = i;} } int main() {while (scanf("%d%d", &n, &m) != EOF){init();for (int i = 1; i <= n; i++){cur[i] = 0;scanf("%s", g[i] + 1);for(int j = 1; j <= m; j++)if (g[i][j] == 'H')cur[i] += (1 << (j - 1) ); //同上一题一样将不能放炮的设为1,这样 & 的话只要非0就不行,因为一定含有不能放炮的而放炮了,0是允许放炮,但是放不放都行,也就是0,1随便,都是可以的 }memset(dp, -1, sizeof(dp));int ans = -1;for (int i = 1; i <= top; i++){num[i] = jcount(state[i]); // 求出每一种状态下能放得炮数if (!fit(state[i], 1))continue;dp[1][1][i] = num[i]; //第一行状态为state[i],第0行状态为state[1] = 0ans = max(ans, num[i]);}for (int i = 2; i <= n; i++){for (int t = 1; t <= top; t++){if (!fit(state[t], i))continue;for (int j = 1; j <= top; j++) // 第 i - 1行的情况 {if (state[t] & state[j])continue;for (int k = 1; k <= top; k++) //第i - 2行的情况 {if (state[t] & state[k])continue;if (dp[i - 1][k][j] != -1) // 不符合要求的,dp[1][1][其他] ,而第0行其他状态都没有 {dp[i][j][t] = max(dp[i][j][t], dp[i - 1][k][j] + num[t]);ans = max(ans, dp[i][j][t]);}}}}}printf("%d\n", ans);}return 0; }
转载于:https://www.cnblogs.com/zhaopAC/p/5322661.html
POJ1185炮兵阵地(状态压缩 + dp)相关推荐
- POJ 1185 炮兵阵地(状态压缩DP)
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- 玉米田 炮兵阵地 状态压缩DP
玉米田 原题 #include <cstring> #include <iostream> #include <algorithm> #include <ve ...
- POJ1185 炮兵阵地 状压DP
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31819 Accepted: 12295 Descriptio ...
- jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】
正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...
- 状态压缩DP(大佬写的很好,转来看)
奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...
- 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)
目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...
- 状态压缩DP AcWing算法提高课 (详解)
基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...
- 状态压缩dp学习小记part2
继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...
- 第一章 动态规划 状态压缩DP
1.基本概述 状态压缩dp和状态机一样,都是一种特殊的状态表示方式.状态机用一系列小状态表示某一状态.状态压缩dp用二进制数进行表示.虽然看代码起来时间复杂度比较高,但是很多的情况都给剪枝掉了. 状态 ...
最新文章
- 时间不同单位之间的转换
- 逻辑模型三要素-数据操作
- JAVA WEB知识总结之一--入门
- 通过git将本地代码上传码云
- poj2965 The Pilots Brothers' refrigerator
- linux查看shell类型与版本号,在Linux命令行下查询当前所使用的shell版本与种类的方法...
- 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
- ComputeColStats UDF中 近似算法的介绍(续)
- .net 面试题 (1)
- oracle恢复init文件,详解NBU异机恢复ORACLE数据库
- python怎么放音乐_python怎么添加背景音乐
- 防止订单重复提交的2种技术解决方案
- 扫二维码登录的实现原理
- wps PPT 中提取视频
- VMworld大会展示最热门24款虚拟化产品
- 面试:Android应用的崩溃率
- 对日ODC与欧美ODC技术分析
- 戴尔服务器r710主板电池位置,戴尔R710内部结构1
- Android中导航栏之溢出菜单OverflowMenu
- 公司企业常见部门名称英译(zt)
热门文章
- hadoop商品推荐_北京尚学堂学员学习经验分享:商品推荐
- R 语言与简单的回归分析
- 极简主义shiny app
- mysql with 查询_mysql笔记(6)-多表查询之with
- 事业编考试计算机专业部分,事业单位考试计算机专业知识汇总-单选题.pdf
- JAVA偏向锁的什么时候释放_​java偏向锁,你还没上车,它就要被去掉了
- 2012.4.17内存相关
- php反序列化漏洞实验,PHP反序列化漏洞简介及相关技巧小结
- mysql关于时间的面试题_关于面试中的mysql试题1
- 将汉字转换成笔画代码_0基础学习五笔输入法之汉字的拆分