poj -- 1185 炮兵阵地
题解:二进制压缩,枚举每行存在的状态,判断与前一行的状态的关系,找出最大值
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 炮兵阵地相关推荐
- 【状态dp】poj 1185 炮兵阵地(三维dp)
poj 1185 炮兵阵地 http://poj.org/problem?id=1185 问题描述:给你一个n行m列的P-H矩阵,H表示不能安置炮兵,1可以安置炮兵,要求炮兵攻击管辖内不能在安置其他炮 ...
- POJ 1185 炮兵阵地(状态压缩DP)
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- POJ 1185 炮兵阵地 (状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14869 Accepted: 5575 Description ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- POJ 1185 炮兵阵地(状压dp)
http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...
- POJ 1185 炮兵阵地 状压dp
http://poj.org/problem?id=1185 经典题目不必多说,直接贴代码. 1 #include<cstdio> 2 #include<cstring> 3 ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ - 1185 炮兵阵地(状压dp)
题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...
- POJ 1185 炮兵阵地
一道非常典型的状态压缩题,对于熟练者来说,绝对算是个水题,但是对于状态压缩入门者,这算是一个好题,能让我们对状态压缩有深刻理解. 解题: 1.先找出一行的符合状态,进行01转换. 2.因为是和前2行有 ...
最新文章
- XGBoost、LightGBM的详细对比介绍
- linux filesystem_Linux 查看磁盘占比?
- uva1471 二叉搜索树
- javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote
- android aar保存图片文件异常_我去!合并AAR时踩坑了!
- 系统上线日期被老外逼得延期了!
- MAC下安装xgboost
- PyTorch 模型训练实用教程(附代码)
- cenos安装erlang
- KITTI立体匹配数据集解析
- qpsk频谱图matlab,QPSK调制得出的调制信号频谱波形多了一个点频信号
- SSM+Bootstrap+MYSQL演唱会网上订票系统
- html浮动垂直居中对齐,css如何设置垂直居中对齐?
- 【数据恢复案例】.[decrypt20@firemail.cc].eking新型变种勒索病毒
- 区域划分问题(数学题)
- 修改rpg maker mv的几种上限2020-05-25
- 关于小米 Mi4 手机的评测
- pyrouge和rouge在Linux上的安装方法以及结果比较
- Socket 【网络通信 - Socket】
- 超级表格迎来深度用户:苏河汇,一个天使投资机构