又是一道有合法性检测的状压题。

dp[i][j][k]表示第i行状态为j,i-1行状态为k时前i行放置的最大数量。

注意22行统计二进制数中1的个数时的巧妙方法。

 1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 int N,M;
6 char map[110][20],num[70],top;
7 int stk[70],cur[70];
8 int dp[110][70][70];
9
10 bool check(int x){//判断该状态是否合法,横向检测相邻的1之间的距离不能小于3
11 if(x&(x<<1)) return 0;
12 if(x&(x<<2)) return 0;
13 return 1;
14 }
15
16 void init(){//记录所有可能的合法状态,最多60种
17 top=0;
18 for(int i=0;i<(1<<M);i++)
19 if(check(i)) stk[top++]=i;
20 }
21
22 int count(int x){//统计状态x的二进制中1的个数
23 int cnt=0;
24 while(x){
25 cnt++;
26 x&=(x-1);//很巧妙的求解方法
27 }
28 return cnt;
29 }
30
31 bool fit(int x,int k){
32 if(cur[k]&x) return 0;
33 return 1;
34 }
35
36 int solve(){
37 int ans=0;
38 memset(dp,-1,sizeof(dp));
39 for(int j=0;j<top;j++){//初始化第一行状态
40 num[j]=count(stk[j]);//统计每个合法状态中1的个数
41 if(fit(stk[j],1)){
42 dp[1][j][0]=num[j];//第一行状态为j,上一行状态为第0个状态,即000000
43 ans=max(ans,dp[1][j][0]);
44 }
45 }
46 for(int i=2;i<=N;i++)
47 for(int j=0;j<top;j++){
48 if(!fit(stk[j],i)) continue;
49 for(int k=0;k<top;k++){
50 if(stk[j]&stk[k]) continue;
51 for(int t=0;t<top;t++){
52 if(stk[j]&stk[t]) continue;
53 if(dp[i-1][k][t]==-1) continue;
54 dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][t]+num[j]);
55 }
56 if(i==N) ans=max(ans,dp[i][j][k]);
57 }
58 }
59 return ans;
60 }
61
62 int main(){
63 while(~scanf("%d%d",&N,&M)){
64 init();
65 for(int i=1;i<=N;i++)
66 scanf("%s",map[i]+1);
67 for(int i=1;i<=N;i++){
68 cur[i]=0;
69 for(int j=1;j<=M;j++)
70 if(map[i][j]=='H')
71 cur[i]+=(1<<(j-1));
72 }
73 printf("%d\n",solve());
74 }
75 return 0;
76 }

POJ1185 [NOI2001] 炮兵阵地 (状压DP)的更多相关文章

  1. [POJ1185][NOI2001]炮兵阵地 状压DP

    题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...

  2. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  3. P2704 [NOI2001]炮兵阵地 (状压DP)

    题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...

  4. [NOI2001]炮兵阵地 状压DP

    题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...

  5. 【POJ1185】炮兵阵地 状压DP

    感觉总是被一些SB错误所困扰... 差不多还是(模板题)注意数组空间的大小,和对于合法状态的判断. f[i][j][k]=max(f[i][k][j],f[i-1][l][k]+num[j]) (f[ ...

  6. POJ1185 炮兵阵地 —— 状压DP

    题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions ...

  7. TZOJ 4912 炮兵阵地(状压dp)

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

  8. poj - 1185 炮兵阵地 状压DP 解题报告

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21553   Accepted: 8363 Description ...

  9. luogu 2704 炮兵阵地 状压dp

    状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...

  10. POJ 1185 炮兵阵地 状压dp

    题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...

随机推荐

  1. C#程序设计的6大原则

    设计模式:面向对象语言开发过程中,遇到各种场景和问题,解决方案和思路沉淀下来,就是设计模式.俗称,套路 设计模式的六大原则:理解为面向对象语言开发过程中推荐的一些指导性的原则,通俗的说是套路的 套路 ...

  2. python 链表、堆、栈

    简介 很多开发在开发中并没有过多的关注数据结构,当然我也是,因此,我写这篇文章就是想要带大家了解一下这些分别是什么东西. 链表 概念:数据随机存储,并且通过指针表示数据之间的逻辑关系的存储结构. 链表 ...

  3. Nginx api接口调用配置

    1 # Nginx api接口调用配置 2 3 # 什么是跨域同源? 4 # 同源策略:协议(http.https.wss--)+域名+端口=一个完整的网站 5 # 跨域:当前所在的网站post(ge ...

  4. Prometheus+Grafana+钉钉部署一个单机的MySQL监控告警系统

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 目录 一.Prometheus 二.exporter ...

  5. 关于MySQL function创建的限制

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL 的function创建会有各种限制,经常使用的语句的限制如下: 1.CONTAINS_DYNAMIC_SQL ...

  6. 查找默认安装的python路径,并输出到 FindPythonPathX_output.txt

    在python程序设计教学中,在汉化IDEL时.为PyCharm项目设置解释器时,经常需要查找python安装路径.对老手来说很简单,但对很多刚开始学习编程的学生来说,则很困难.所以,编写了一个批处理 ...

  7. 迅捷Flutter图片浏览软件

    下载地址: https://github.com/patton88/agile_flutter_picture_show/raw/master/agile_flutter_picture_show_v ...

  8. 日均 6000+ 实例,TB 级数据流量,Apache DolphinScheduler 如何做联通医疗大数据平台的“顶梁柱”?

    作者 | 胡泽康 鄞乐炜 作者简介 胡泽康 联通(广东)产业互联网公司  大数据工程师,专注于开源大数据领域,从事大数据平台研发工作 鄞乐炜 联通(广东)产业互联网公司 大数据工程师,主要从事大数据平 ...

  9. js中数组去重的方法

    在实际工作或面试中,我们经常会遇到"数组去重"问题,接下来就是使用js实现的数组去重的多种方法: 1.借助ES6提供的Set结构 var arr = [1,1,2,2,3,3,4, ...

  10. Luogu2858[USACO06FEB]奶牛零食Treats for the Cows (区间DP)

    我是个傻逼,这么水的题都会T #include <iostream> #include <cstdio> #include <cstring> #include & ...