题目链接

题意:给出一张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)相关推荐

  1. POJ 1185 炮兵阵地(状态压缩DP)

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...

  2. 玉米田 炮兵阵地 状态压缩DP

    玉米田 原题 #include <cstring> #include <iostream> #include <algorithm> #include <ve ...

  3. POJ1185 炮兵阵地 状压DP

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31819   Accepted: 12295 Descriptio ...

  4. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】

    正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...

  5. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  6. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  7. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  8. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  9. 第一章 动态规划 状态压缩DP

    1.基本概述 状态压缩dp和状态机一样,都是一种特殊的状态表示方式.状态机用一系列小状态表示某一状态.状态压缩dp用二进制数进行表示.虽然看代码起来时间复杂度比较高,但是很多的情况都给剪枝掉了. 状态 ...

最新文章

  1. 时间不同单位之间的转换
  2. 逻辑模型三要素-数据操作
  3. JAVA WEB知识总结之一--入门
  4. 通过git将本地代码上传码云
  5. poj2965 The Pilots Brothers' refrigerator
  6. linux查看shell类型与版本号,在Linux命令行下查询当前所使用的shell版本与种类的方法...
  7. 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
  8. ComputeColStats UDF中 近似算法的介绍(续)
  9. .net 面试题 (1)
  10. oracle恢复init文件,详解NBU异机恢复ORACLE数据库
  11. python怎么放音乐_python怎么添加背景音乐
  12. 防止订单重复提交的2种技术解决方案
  13. 扫二维码登录的实现原理
  14. wps PPT 中提取视频
  15. VMworld大会展示最热门24款虚拟化产品
  16. 面试:Android应用的崩溃率
  17. 对日ODC与欧美ODC技术分析
  18. 戴尔服务器r710主板电池位置,戴尔R710内部结构1
  19. Android中导航栏之溢出菜单OverflowMenu
  20. 公司企业常见部门名称英译(zt)

热门文章

  1. hadoop商品推荐_北京尚学堂学员学习经验分享:商品推荐
  2. R 语言与简单的回归分析
  3. 极简主义shiny app
  4. mysql with 查询_mysql笔记(6)-多表查询之with
  5. 事业编考试计算机专业部分,事业单位考试计算机专业知识汇总-单选题.pdf
  6. JAVA偏向锁的什么时候释放_​java偏向锁,你还没上车,它就要被去掉了
  7. 2012.4.17内存相关
  8. php反序列化漏洞实验,PHP反序列化漏洞简介及相关技巧小结
  9. mysql关于时间的面试题_关于面试中的mysql试题1
  10. 将汉字转换成笔画代码_0基础学习五笔输入法之汉字的拆分