poj1185(状压dp)
题目连接:http://poj.org/problem?id=1185
题意:给出一张n*m的地图,'H'表示高地,不能部署炮兵,'P'表示平原,可以部署炮兵,炮兵之间必须保持横向、纵向至少2个格子的距离,保证没有误伤。问最多可以部署多少炮兵。
分析:对于每行大炮的状态仅与上两行的状态有关,因此要开个三维的数组来表示状态,当前行的状态可由前两行的状态转移而来。
当前行的最大值就是上一个状态的值加上当前状态中1的个数(当前行放大炮的个数)。
dp[i][j][k]表示到第i行时第i行的状态为j,第i-1行的状态为k的最大值,则dp[i][j][k] =max(dp[i][j][k],dp[i-1][k][l]+num[j]); num[j]为i状态中1的个数。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-9
#define N 100010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int dp[][][],n,m,tot;
int cur[],state[],num[];
char s[][];
bool ok(int x)
{
if(x&(x<<))return ;
if(x&(x<<))return ;
return ;
}
bool fit(int state,int k)//判断状态state在第k行是否符合
{
if(state&cur[k])return ;
return ;
}
void init()//预处理每行符合条件的所有状态
{
int sum=<<m;
tot=;
for(int i=;i<sum;i++)
{
if(ok(i))state[++tot]=i;
}
}
int cal(int x)//计算该状态二进制的1的个数
{
int res=;
while(x)
{
if(x&)res++;
x>>=;
}
return res;
}
int main()
{
while(scanf("%d%d",&n,&m)>)
{
if(m+n==)break;
init();
for(int i=;i<=n;i++)scanf("%s",s[i]+);
for(int i=;i<=n;i++)
{
cur[i]=;
for(int j=;j<=m;j++)
{
if(s[i][j]=='H')cur[i]+=<<(m-j);
}
}
FILL(dp,);
for(int i=;i<=tot;i++)
{
num[i]=cal(state[i]);
if(fit(state[i],))dp[][i][]=num[i];
}
for(int i=;i<=n;i++)
{
for(int j=;j<=tot;j++)
{
if(!fit(state[j],i))continue;
for(int k=;k<=tot;k++)
{
if(!fit(state[k],i-))continue;
if(state[j]&state[k])continue;
for(int l=;l<=tot;l++)
{
if(state[l]&state[k])continue;
if(state[l]&state[j])continue;
if(i>&&!fit(state[l],i-))continue;
dp[i][j][k]=max(dp[i][j][k],dp[i-][k][l]+num[j]);
}
}
}
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=tot;j++)
for(int k=;k<=tot;k++)
ans=max(ans,dp[i][j][k]);
printf("%d\n",ans);
}
}
poj1185(状压dp)的更多相关文章
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- 【POJ1185】炮兵阵地(状压DP)
题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...
- poj1185:炮兵阵地(状压dp)
也算是比较基础的状压dp了,跟做过的第二道比较又稍微复杂了一点 需要记录之前两行的状态.. 统计结果也稍有不同 另外还学习了一个得到一个整数二进制位 1 的个数的位运算方法 详见代码: #includ ...
- 2018.09.08 poj1185 炮兵阵地(状压dp)
传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- 算法复习——状压dp
状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
随机推荐
- MSSQL - 因为数据库正在使用,所以无法获得对数据库的独占访问权。
关于“因为数据库正在使用,所以无法获得对数据库的独占访问权”的最终解决方案 今天在使用SQL Server2005对某个数据库进行还原操作的时候,出现了如上问题,“因为数据库正在使用,所以无法获得 ...
- Poj 3771 hdu 3405
poj 3771 http://poj.org/problem?id=3771 wiki Prim http://zh.wikipedia.org/wiki/%E6%99%AE%E6%9E%97%E5 ...
- JavaScript编程:文档对象模型DOM
5.文档对象模型DOM JS里的DOM和XML里的DOM不同,但是解析方式是一样的. document.getElementByID("id")根据ID获得元素节点. 创建和操作节 ...
- 使用JDK自带的工具将中文转换为ascii码
有时候在MyEclipse中,文件只能保存为“ISO-8859-1”的类型,而这种类型的文件时无法保存中文数据的,那么我们只能将中文数据经过Unicode编码才能往文件中保存,这里可以使用JDK自带的 ...
- vcredist_x86.exe 静默安装方法
我们打包基于VC++开发的应用程序,我们会一同打包一个VC运行库,否则安装到一些非开发环境中,你的应用程序依然可以正确运行. Visual C++ 2008 Redistributable Packa ...
- Spring MVC Controller与jquery ajax请求处理json
在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: "}]}]} $.ajax({ url : url, typ ...
- POJ 1781 In Danger Joseph环 位运算解法
Joseph环,这次模固定是2.假设不是固定模2,那么一般时间效率是O(n).可是这次由于固定模2,那么能够利用2的特殊性,把时间效率提高到O(1). 规律能够看下图: watermark/2/tex ...
- 4.锁--Synchronizer Framework Base Class—AbstractQueuedSynchronizer介绍
1. AQS简单介绍 AQS是Java并发类库的基础.其提供了一个基于FIFO队列,可以用于构建锁或者其它相关同步装置的基础框架.该同步器(下面简称同步器)利用了一个int来表示状态,期望它可以成为实 ...
- 介绍SAP预留函数创建搜索帮助
紧接上一节介绍的SAP预定义的出口函数F4IF_SHLP_EXIT_EXAMPLE创建搜索帮助, 该函数主要有两个部分: Changing接口的参数属性如下: SHLP:搜索帮助的基础描述,包括搜索帮 ...
- jsp:include怎么设置才能正确显示包含的页面呢
1.项目的所有jsp都放在WEB-INF文件夹之下,使用的是SpirngMVC进行了过滤,jsp:include只能引入WEB-INF外部的jsp文件,对于改变后缀显示为htm的jsp的WEB-INF ...