题目:http://poj.org/problem?id=1185

大神的题解:

方法就是用DP[i][r][p]表示第i行状态为r,第i-1行状态是p时的最多个数。而这里p受到r的限制,而第i-2行状态q则受到r和p两个状态限制。状态转移方程就是:

DP[i][r][p] = MAX{DP[i-1][p][q] +num[r]}

其中,p是受到r的限制时枚举的状态,q是受到r和p共同限制时候的状态,num[r]表示状态r里面的布局炮兵所摆的个数。

这里我们可以看到就要枚举i,r,p,q,这4 个变量,i的范围是100,而其他几个则都是1<<10,复杂度颇为偏高。而实际上由于每一行里面有很多都是某些位置被其他位置影响的。比如:   1110001,  如果第一个位置放上炮兵,那么第二第三的位置都会受到影响,而一个也放不了。

解决方案就是不去管那些相互有影响的状态,把形如:

1000000    0100000    ... ...

1001000    0100001    ... ...

...

1001001

这些相互之间没有影响的状态找出来,这样所有的状态数就会减少至少于60种(我算了一下,好像是58种),这样一来就是60*60*60*100,可以过了。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define mod 100000000
using namespace std;
int m,n,top,state[],cur[],num[],dp[][][];
char tu[][];
inline bool ok(int x)
{
if(x&(x<<)) return false;
if(x&(x<<)) return false;
return true;
}
inline void init()
{
int tol=<<n;
top=;
for(int i=; i<tol; i++)
{
if(ok(i)) state[++top]=i;
}
}
inline bool fit(int x,int k)
{
if(x&cur[k]) return false;
return true;
}
inline int icount(int x)
{
int cnt=;
while(x)
{
cnt++;
x=x&(x-);
}
return cnt;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
init();
for(int i=; i<=m; i++)
scanf("%s",tu[i]+);
for(int i=;i<=m;i++)
{
cur[i]=;
for(int j=;j<=n;j++)
{
if(tu[i][j]=='H')
cur[i]+=(<<(n-j));
}
}
memset(dp,,sizeof(dp));
for(int i=; i<=top; i++)
{
num[i]=icount(state[i]);
if(fit(state[i],))
dp[][][i]=num[i];
}
for(int i=; i<=m; i++)
{
for(int t=; t<=top; t++)
{
if(!fit(state[t],i)) continue;//符合本行
for(int j=; j<=top; j++)
{
if(state[j]&state[t]) continue;//符合上一行
for(int k=; k<=top; k++) //符合上上行
{
if(state[k]&state[t]) continue;
if(state[k]&state[j]) continue;
dp[i][j][t]=max(dp[i][j][t],(dp[i-][k][j]+num[t]));
}
}
}
}
int maxx=-;
for(int i=; i<=m; i++)
{
for(int j=; j<=top; j++)
{
for(int k=; k<=top; k++)
{
maxx=max(maxx,dp[i][j][k]);
}
}
}
printf("%d\n",maxx);
}
return ;
}

POJ1185:炮兵阵地(状压dp)的更多相关文章

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

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

  2. poj1185 炮兵阵地 状压dp

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

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

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

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

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

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

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

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

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

  7. luogu 2704 炮兵阵地 状压dp

    状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...

  8. POJ 1185 炮兵阵地 状压dp

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

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

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

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

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

随机推荐

  1. 第二百六十九节,Tornado框架-Session登录判断

    Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作 ...

  2. 怎么取消环境变量设置 shell

    Linux字符模式下设置/删除环境变量方法: bash下 设置:export 变量名=变量值 删除:unset 变量名 转自:http://zhidao.baidu.com/link?url=sY3u ...

  3. List<T>转DataTable

    /// <summary> /// 将集合类转换成DataTable /// </summary> /// <param name="list"> ...

  4. Excel随机生成数据

    CONCATENATE函数是一个文本连接函数,非常简单,和&的效果一样. CONCATENATE是一个文本连接函数 语法:CONCATENATE(text1,text2,text3...... ...

  5. Objective-C Runtime初探:self super

    题目 上题目,已知A是爷爷,B是爸爸,C是孙子. @interface A : NSObject - (void)f; @end @interface B : A - (void)f; - (void ...

  6. iOS开发之-- 从当前隐藏导航界面push到下一个显示导航界面出现闪一下的问题

    在修改项目代码的过程中,遇到一个问题,就是比如主页面的导航栏是隐藏的,但是需要push到别的页面,这个时候,会出现导航栏闪一下的情况, 下面是我写的一种方案,也就是在loadView这个生命周期函数中 ...

  7. 控制iOS 7中的状态栏

    本文转载至:http://blog.csdn.net/pucker/article/details/12112105 苹果终于发布了iOS 7正式版,大批的用户都已经纷纷进行了升级.如果App是由Xc ...

  8. Oracle索引相关

    oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引. 创建索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名; ...

  9. Android测试:从零开始2——local单元测试

    上一篇分析了android项目的测试分类,这一篇讲local单元测试. 参考android官方文档. 测试前需要配置测试环境,新建项目后,目录下会出现app/src/test/java/文件夹,这个文 ...

  10. 【BZOJ1135】[POI2009]Lyz 线段树

    [BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...