[poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185
题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数。
注释:n<=100,m<=10。然后只能在平原的地方建立炮兵。
想法:第2到状压dp,++。这题显然是很经典的。设状态dp[i][j][k]表示第i行的状态为j,i-1行的状态为k的最多炮兵数。在转移时,枚举所有的合法炮兵排列(此处的合法数目是根据一行全为平原的时候能放置的合法炮兵数目),然后内层循环枚举dp[i-1]的i-1状态,进行特判更新即可。统计答案时,我们只需对于dp[n]的所有可能状态求最大值即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[105][65][65];
int cnt=0;
int str[65];
int sum[65];
int map[110];
char s[110][110];
bool check(int x)//判断这个排列是否为普通的合法序列
{
if(x&(x<<1)) return false;
if(x&(x<<2)) return false;
return true;
}
int getSum(int x)//当前状态的炮兵数目
{
int ans=0;
while(x>0)
{
if(x&1) ans++;
x>>=1;
}
return ans;
}
void before_hand(int mid)//预处理出所有的可能合法炮兵状态,cnt统计状态数
{
for(int i=0;i<(1<<mid);i++)
{
if(check(i))
{
str[cnt]=i;//str数组记录状态,dp中的j和k都是str数组的下标
sum[cnt]=getSum(i);
cnt++;
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,-1,sizeof dp);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
char a;
cin >> a;
if(a=='H') map[i]|=(1<<j);//统计每一行的不合法格子状态
}
}
before_hand(m);//其实可以不传参
for(int i=0;i<cnt;i++)
{
if(!(str[i]&map[0])) dp[0][0][i]=sum[i];//先处理出第一行的情况
}
for(int r=1;r<n;r++)//枚举行数
{
for(int i=0;i<cnt;i++)//枚举当前行的排列
{
if(str[i]&map[r]) continue;
for(int j=0;j<cnt;j++)//枚举上一行的排列情况
{
if(str[i]&str[j]) continue;
for(int k=0;k<cnt;k++)//枚举i-2行的排列情况
{
if(str[i]&str[k]) continue;
if(dp[r-1][k][j]==-1) continue;
dp[r][j][i]=max(dp[r][j][i],dp[r-1][k][j]+sum[i]);//更新即可
}
}
}
}
int ans=0;//统计答案
for(int i=0;i<cnt;i++)
{
for(int j=0;j<cnt;j++)
{
ans=max(ans,dp[n-1][i][j]);
}
}
printf("%d\n",ans);
return 0;
}
小结:这道题非常经典,我们有一种用空间换时间的办法就是4维dp。
错误:卧槽!!一定牢记...判断时用的是运算符&而不是&&!!!
[poj1185]炮兵阵地_状压dp的更多相关文章
- 2018.09.08 poj1185 炮兵阵地(状压dp)
传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...
- poj1185 炮兵阵地【状压DP】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32802 Accepted: 12650 Descriptio ...
- 【POJ1185】炮兵阵地(状压DP)
题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...
- poj1185:炮兵阵地(状压dp)
也算是比较基础的状压dp了,跟做过的第二道比较又稍微复杂了一点 需要记录之前两行的状态.. 统计结果也稍有不同 另外还学习了一个得到一个整数二进制位 1 的个数的位运算方法 详见代码: #includ ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ P1185 炮兵阵地 【状压dp】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- [NOI2001]炮兵阵地 【状压DP】
#\(\color{red}{\mathcal{Description}}\) \(Link\) 司令部的将军们打算在\(N \times M\)的网格地图上部署他们的炮兵部队.一个\(N \time ...
- [NOI2001] 炮兵阵地 (状压Dp经典例题)
如果您的电脑比较优秀能在 1sec 内跑过 2^1000 的时间复杂度,不妨你可以尝试一下,其实实际时间复杂度远远少于 2^1000,作为骗分不错的选择QAQ,然后我们来分析一下正解: 很显然此题是一 ...
随机推荐
- 无法连接MySQL
1.错误描述 Error No. 2003 Can't connect to MySQL Server on 'localhost' (10061) 2.错误原因 打开任务管理器,关闭了m ...
- Caused by: java.lang.ClassNotFoundException: com.mchange.v2.ser.Indirector
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Filter的注册2
既然Filter是一种COM组件,使用前就必须先注册.Filter的注册程序为regsvr32.exe (位于操作系统目录的system32子目录下).假设现在有一个Filter文件,它的完整路径为C ...
- 第一次C语言实验报告
一.实验题目,设计思路,实现方法 实验四4-2-9三个数由小到大输出,要求比较三数大小并按顺序输出.运用穷举法列举所有可能性再对应输出.运用多分支结构. 实验四4-2-4 三天打鱼两天晒网,运用循环结 ...
- Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)
一.介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...
- IOS开发之XCode学习008:UIViewController基础
此文学习来源为:http://study.163.com/course/introduction/1002858003.htm 红色框选部分用A代替,AppDelegate类在程序框架启动时,如果在i ...
- class-逻辑回归与最大熵模型
我们知道,线性回归能够进行简单的分类,但是它有一个问题是分类的范围问题,只有加上一个逻辑函数,才能使得其概率值位于0到1之间,因此本次介绍逻辑回归问题.同时,最大熵模型也是对数线性模型,在介绍最大熵模 ...
- Spring Boot 文件上传
其实网上已经有很多这样的文章了.为什么我还要记录一下呢?原因是在工作中对接外系统时,碰到了他们调取我们文件上传接口确存在着http请求头部规范的情况,从而导致用传统方法获取不到参数.今天就来整理下Sp ...
- 期望$DP$ 方法总结
期望\(DP\) 方法总结 这个题目太大了,变化也层出不穷,这里只是我的一点心得,不定期更新! 1. 递推式问题 对于无穷进行的操作期望步数问题,一般可用递推式解决. 对于一个问题\(ans[x]\) ...
- Android学习之AutoCompleteTextView和MultiAutoCompleteTextView
转自:http://blog.csdn.net/qq_28468727/article/details/52258409 AutoCompleteTextView.MultiAutoCompleteT ...