状压的基础题吧

第一次看感觉难上天,后来嘛就。。

套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案

f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可

  1. #include<bits/stdc++.h>
  2. #define rep(i,x,y) for(register int i=x;i<=y;i++)
  3. using namespace std;
  4. inline int read(){
  5. int x=,f=;char ch=getchar();
  6. while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
  7. while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
  8. return x*f;}
  9. inline int calc(int x){int ans=;for(;x;x-=x&(-x))ans++;return ans;}
  10. //state 状态的具体集合
  11. //num 状态的答案贡献(1数量)
  12. int cnt,n,m;
  13. int f[][][],num[],state[],g[];
  14. void dp(){
  15. int ans=;
  16. memset(f,,sizeof f);
  17. for(int i=;i<n;i++)//本行
  18. for(int j=;j<cnt;j++){//本行状态
  19. if(g[i]&state[j]) continue;
  20. if(i==) f[i][j][]=num[j];
  21. else if(i==){
  22. for(int k=;k<cnt;k++){
  23. if(g[i-]&state[k]) continue;
  24. if(state[j]&state[k]) continue;
  25. f[i][j][k]=max(f[i][j][k],f[i-][k][]+num[j]);
  26. }
  27. }else{
  28. for(int k=;k<cnt;k++){
  29. if(g[i-]&state[k]) continue;
  30. if(state[j]&state[k]) continue;
  31. for(int p=;p<cnt;p++){
  32. if(g[i-]&state[p]) continue;
  33. if(state[k]&state[p]||state[j]&state[p]) continue;
  34. //三行都要兼容
  35. f[i][j][k]=max(f[i][j][k],f[i-][k][p]+num[j]);
  36. }
  37. }
  38. }
  39. }
  40. for(int j=;j<cnt;j++)
  41. for(int k=;k<cnt;k++)
  42. ans=max(ans,f[n-][j][k]);
  43. printf("%d\n",ans);
  44. }
  45. int main(){
  46. char s[];
  47. int i,j;
  48. n=read();m=read();
  49. for(i=;i<n;i++){
  50. scanf("%s",s);
  51. for(j=;j<m;j++)
  52. if(s[j]=='H') g[i]+=(<<(m--j));
  53. }
  54. int tmp;cnt=;
  55. for(int i=;i<(<<m);i++){
  56. tmp=i;
  57. if(((tmp<<)&i)|((tmp<<)&i)) continue;
  58. state[cnt]=i;
  59. num[cnt]=calc(i);++cnt;}
  60. //利用函数计算当前状态中1的数量
  61. //cnt代表当前限制条件下合法状态
  62. dp();return ;
  63. }
  64. //先根据自身条件确定状态
  65. //再根据给定地图判断

luogu 2704 炮兵阵地 状压dp的更多相关文章

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

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

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

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

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

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

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

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

  5. POJ 1185 炮兵阵地 状压dp

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

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

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

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

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

  8. 炮兵阵地 /// 状压DP oj26314

    题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...

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

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

随机推荐

  1. 自制模态窗体闪烁效果: MessageBeep & FlashWindowEx

    SetFocus(hwnd_frame_preview); //设置焦点 /** 模拟模态窗口动作 **/ MessageBeep(0xFFFFFFFF); //0xFFFFFFFF SystemDe ...

  2. SecureCRT或XShell软件

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. Xshell 是一个强大的安全终端模拟软件,它支持SSH1 ...

  3. 动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题

    转: 动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题 2018年05月13日 00:40:32 codingCoge 阅读数:1211   版权声明 ...

  4. TestNg 8.参数化测试 - xml

    有的时候,case需要参数,那么,传餐怎么传? 我的目录结构:首先建一个包叫做parameter,然后在resource里面新建一个parameter.xml文件 看以下代码: ParameterTe ...

  5. Transactional 事务

    1.事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚 其实像第一种try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中 ...

  6. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机

    题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...

  7. Go结构体

    当我们要表示同一种数据类型时候,可以用到数组,切片和字典. 当我们要表示不同的数据类型呢?这时候就要用到结构体了 一:定义struct 关键字 type 和 struct 来定义结构体 type st ...

  8. redis的使用场景和基本数据类型

    一:redis使用的场景 redis是一个高性能的NoSQL数据库,特点是高性能,持久存储,适应高并发的应用场景. 下面看看它的使用场景1.取最新N个数据的操作比如取网站的最新文章,通过下面方式,我们 ...

  9. Linux设备树(一 概述)

    一 概述 设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡 ...

  10. day15-ajax和jquery

    回顾: 分页: 将数据按照页码划分,提高用户的体验度. 分类: 逻辑分页:一次性将内容加载到内存(list),获取自己想要的数据 sublist截取.缺点:维护起来麻烦 物理分页:(经常使用) 每次只 ...