题解:二进制压缩,枚举每行存在的状态,判断与前一行的状态的关系,找出最大值

dp[i][j][k] = max(dp[i][j][k] , dp[i-1][k][[l] + p[j]) 表示第i行第j个状态,i-1行的第k个状态炮兵的最大数量

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[105][70][70];
char map[105][20];
int a[105];
int s[70],p[70];
int n,m,num;
bool ok(int x){if(x&(x<<1)) return false; //如果x的二进制里存在为类似于 11 则不满足if(x&(x<<2)) return false; //如果x的二进制里存在为类似于 101或11,则不满足return true;
}
void init(){//求解多少种符合的状态num = 0;for(int i = 0;i < (1<<m);i++)if(ok(i)) s[++num] = i;
}
bool find(int x,int k){//所放的炮的状态是否与山地重合if(a[k]&x) return false;return true;
}
int cal(int x){   //计算x状态下1的个数,即此状太下能放炮兵的个数int count = 0;while(x){count ++;x &= (x-1);}return count;
}
int main(){while(~scanf("%d%d",&n,&m)){init();for(int i = 1;i <= n;i++){scanf("%s",map[i]+1);a[i] = 0;for(int j = 1;j <= m;j++){if(map[i][j] == 'H') a[i] +=(1<<(j-1));//记录每一行有山地的状态}}memset(dp,0,sizeof(dp));memset(p,0,sizeof(p));for(int i = 1;i <= num;i++){p[i] = cal(s[i]);                         //p[i] 存储每种状态的的山地的个数if(find(s[i],1)) dp[1][i][1] = p[i];      //判定此状态下是否与存在山地的状态矛盾}for(int i = 2;i <= n;i++){for(int j= 1;j <= num;j++){if(!find(s[j],i)) continue;for(int k = 1;k <= num;k++){if(s[k]&s[j]) continue;for(int l = 1;l <= num;l++){if(s[l]&s[j]) continue;
//                        if(dp[i-1][j][k] == -1) continue;dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][l] + p[j]);//用第i行的状态为j,第i-1行状态为k时的值}}}}int ans = 0;for(int i = 1;i <= num;i++){for(int j = 1;j <= num;j++){ans = max(ans,dp[n][i][j]);}}printf("%d\n",ans);}
}

poj -- 1185 炮兵阵地相关推荐

  1. 【状态dp】poj 1185 炮兵阵地(三维dp)

    poj 1185 炮兵阵地 http://poj.org/problem?id=1185 问题描述:给你一个n行m列的P-H矩阵,H表示不能安置炮兵,1可以安置炮兵,要求炮兵攻击管辖内不能在安置其他炮 ...

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

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

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

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

  4. POJ 1185 炮兵阵地(动态规划+状态压缩)

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

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

    http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...

  6. POJ 1185 炮兵阵地 状压dp

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

  7. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

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

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

  9. POJ 1185 炮兵阵地

    一道非常典型的状态压缩题,对于熟练者来说,绝对算是个水题,但是对于状态压缩入门者,这算是一个好题,能让我们对状态压缩有深刻理解. 解题: 1.先找出一行的符合状态,进行01转换. 2.因为是和前2行有 ...

最新文章

  1. XGBoost、LightGBM的详细对比介绍
  2. linux filesystem_Linux 查看磁盘占比?
  3. uva1471 二叉搜索树
  4. javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote
  5. android aar保存图片文件异常_我去!合并AAR时踩坑了!
  6. 系统上线日期被老外逼得延期了!
  7. MAC下安装xgboost
  8. PyTorch 模型训练实用教程(附代码)
  9. cenos安装erlang
  10. KITTI立体匹配数据集解析
  11. qpsk频谱图matlab,QPSK调制得出的调制信号频谱波形多了一个点频信号
  12. SSM+Bootstrap+MYSQL演唱会网上订票系统
  13. html浮动垂直居中对齐,css如何设置垂直居中对齐?
  14. 【数据恢复案例】.[decrypt20@firemail.cc].eking新型变种勒索病毒
  15. 区域划分问题(数学题)
  16. 修改rpg maker mv的几种上限2020-05-25
  17. 关于小米 Mi4 手机的评测
  18. pyrouge和rouge在Linux上的安装方法以及结果比较
  19. Socket 【网络通信 - Socket】
  20. 超级表格迎来深度用户:苏河汇,一个天使投资机构

热门文章

  1. 北京 | 一场产品经理必听的实战交流会!
  2. Centos7 下部署PPTP
  3. NLPIR智能语义:大数据精准挖掘是信息化发展趋势
  4. Ubuntu 10.04下SSH配置
  5. UML--核心元素之包
  6. IOS中通知中心(NSNotificationCenter)的使用总结
  7. Script:列出失效索引或索引分区
  8. what do eco consulting do
  9. C# 与 Unity 同名函数
  10. 北京通州拟3年培训技能人才5万人次 服务城市副中心行政办公区等