题意简述:给定一个大小为n*m的棋盘,棋盘上'H'表示不可放置,'P'表示可放置,一个棋子在棋盘上的攻击范围是其左右上下2格以内,求不冲突情况下的最多摆放棋子数。

分析:决策是对于一个P格子考虑放或不放,因为棋盘是二维的,所以考虑状压,其中m<=10,所以对行状压,那么可用f[i]表示前i行的最多摆放棋子数,但考虑到第i行的摆放决策取决于i-2、i-1行的摆放情况,因此需要给f增加两维,即用f[i][j][k]表示摆放前i行,并以j和k作为结尾的两行的最大棋子数,于是状态转移方程为:f[i][j][k]=max(f[i-1][w][j])+num[k]。其中一些细节是能否摆放、横向冲突以及纵向冲突的判断,空间可用滚动数组优化。最后是复杂度分析,感觉上,时间复杂度应该是O(n*(1<<m)^3),大约为1e11,直接T飞,但实际上可以预处理出所有横向不冲突的状态,设横向不冲突状态数为p,p最大为60,这样时间复杂度就降为O(n*p^3),100*60^3大约为2e7,可以接受,因为只需要枚举p个状态,因此空间复杂度为O(p^2)。还有最坑的一点就是n=1的边界情况,这个要特判一下。

代码:

#include<stdio.h>
const int N=100+3,max=60;
int n,m;
int a[N],num[max+3],res[max+3],f[2][max+3][max+3];
inline int maxx(int a,int b){return a>b?a:b;}
inline int lowbit(int x){return x&(-x);}
void ini()
{for (int i=0;i<(1<<m);i++){bool flag=(((i<<2)&i)||((i<<1)&i)||((i>>1)&i)||((i>>2)&i));if (!flag) res[++res[0]]=i;}for (int i=1;i<=res[0];i++)for (int j=res[i];j;j-=lowbit(j)) num[i]++;
}
void dp()
{for (int j=1;j<=res[0];j++)if (!(res[j]&a[1]))for (int k=1;k<=res[0];k++)if (!(res[k]&a[2])&&!(res[j]&res[k]))f[0][j][k]=num[j]+num[k];for (int i=3;i<=n;i++)for (int j=1;j<=res[0];j++)if (!(res[j]&a[i-1]))for (int k=1;k<=res[0];k++)if (!(res[k]&a[i])&&!(res[j]&res[k])){f[i&1][j][k]=-1;for (int w=1;w<=res[0];w++)if (!(res[w]&a[i-2])&&!(res[w]&res[j])&&!(res[w]&res[k]))f[i&1][j][k]=maxx(f[i&1][j][k],f[(i-1)&1][w][j]+num[k]);}
}
void special()
{int ans=-1;for (int i=1;i<=res[0];i++)if (!(res[i]&a[1])) ans=maxx(ans,num[i]);printf("%d",ans);
}
signed main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){char s[10+5]; scanf("%s",s+1);for (int k=m;k>=1;k--) a[i]=(a[i]<<1)+(s[k]=='H'?1:0);}ini(); if (n==1) {special();return 0;}dp();int ans=-1;for (int j=1;j<=res[0];j++)if (!(res[j]&a[n-1]))for (int k=1;k<=res[0];k++)if (!(res[k]&a[n])&&!(res[j]&res[k]))ans=maxx(ans,f[n&1][j][k]);printf("%d",ans);return 0;
}

P2704 炮兵阵地 (状压dp入门题) 题解相关推荐

  1. 洛谷P2704 [NOI2001]炮兵阵地(状压dp)

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

  2. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  3. POJ1185 炮兵阵地 状压DP

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

  4. POJ 1185 炮兵阵地 (状压DP)

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

  5. POJ 1185 炮兵阵地 状压dp

    http://poj.org/problem?id=1185 经典题目不必多说,直接贴代码. 1 #include<cstdio> 2 #include<cstring> 3 ...

  6. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  7. agc012E Camel and Oases(状压dp+思路题)

    这题神啊.状压dp你敢信?思维难度爆表还有一堆细节要注意???orz Visjiao 原题链接:http://agc012.contest.atcoder.jp/tasks/agc012_e 大神题解 ...

  8. Corn fields(玉米田)状压dp入门第一题 洛谷P1879 poj3254

    题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...

  9. poj3254 Corn Fields 状压DP入门

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19368   Accepted: 10169 Des ...

最新文章

  1. (正)斜杠 与 反斜杠
  2. js操作frame详细解说,window.opener和window.parent的区别
  3. how do you usually upload picture in SCN A workaround for current SCN upload is
  4. IOS之自动创建项目各个文件夹
  5. Java 截取反斜杠--java使用split拆分特殊字符
  6. Android 8.0学习(18)--- Android8.0运行时权限策略变化和适配方案
  7. 大象的崛起!Hadoop七年发展风雨录
  8. Django | 静态文件处理
  9. 借助创客匠人玩转视频号
  10. Solaris系统root用户无法直接登录
  11. HTML给表格写个标题居中,如何将表格中的各个标题居中?
  12. 链行动之精选案例——区块链解决四大痛点 福费廷结合案例逐步落地
  13. linux+++乘法口诀_通过shell脚本打印乘法口诀表
  14. html5 3d游戏引擎演示,HTML5、JavaScript 3D游戏引擎和框架
  15. 2021-06-10 multisim仿真,高温报警电路555
  16. EF系列(二)——DbContext 和DbSet
  17. 数组,下标越界及小结
  18. 白银价格转换器(美元/盎司-人民币/克)
  19. 探索式测试解密——无探索,不测试!
  20. Jquery绑定focus事件遇到的问题

热门文章

  1. 第四周-自动班作业及实验
  2. 学计算机的用什么电脑哈,学设计的用什么笔记本电脑好
  3. 数字化转型不仅能进一步便利人民生活,也能促进长三角区域经济高质量发展
  4. Word 2003 视频教程-Word 关闭文件(转)
  5. 怎么通过电商数据分析选择好货源?
  6. php 获取临时素材,php微信获取临时素材的方法(附代码)
  7. 搭建JAVAWEB开发环境
  8. oracle计算某一列值雷加,剑灵刺客新老版本输出数据实测 强弱立现
  9. JAVA字符串转日期或日期转字符串
  10. 什么是TDD?(Test Driven Development)