状态压缩dp

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std; #define MAX_COL_NUM 15
#define MAX_ROW_NUM 105
#define MAX_STAT 2050 struct Status
{
int row_bit[];
int last_bit_count;
}status[]; int row_num, col_num;
int grid[MAX_ROW_NUM];
int f[][MAX_STAT][MAX_STAT];
int ans;
int status_cnt; void input()
{
scanf("%d%d", &row_num, &col_num);
for (int i = ; i < row_num; i++)
{
char row[MAX_COL_NUM];
scanf("%s", row);
int row_bit = ;
for (int j = ; row[j]; j++)
{
if (row[j] == 'H')
{
row_bit = (row_bit << ) | ;
}else
{
row_bit = (row_bit << ) | ;
}
}
grid[i] = row_bit;
}
} int count_bit(int a)
{
int ret = ;
while (a > )
{
if (a & )
ret++;
a >>= ;
}
return ret;
} bool ok(int bit)
{
while (bit > )
{
if ((bit & ) == )
return false;
if ((bit & ) == )
return false;
bit >>= ;
}
return true;
} bool ok(int bit, int row)
{
return (bit & grid[row]) == ;
} void init()
{
memset(f, , sizeof(f));
int col_stat = ;
for (int i = ; i < col_num; i++)
col_stat *= ;
for (int i = ; i < col_stat; i++)
{
int temp = i;
int row_bit[];
row_bit[] = row_bit[] = ;
for (int j = ; j < col_num; j++)
{
row_bit[] <<= ;
row_bit[] <<= ;
row_bit[temp % ] |= ;
temp /= ;
}
if (!ok(row_bit[], ) || !ok(row_bit[], ) || !ok(row_bit[]) || !ok(row_bit[]))
{
f[][row_bit[]][row_bit[]] = ;
continue;
}
f[][row_bit[]][row_bit[]] = count_bit(row_bit[]) + count_bit(row_bit[]);
ans = max(ans, f[][row_bit[]][row_bit[]]);
} } void make_stat()
{
int col_stat = ;
status_cnt = ;
for (int i = ; i < col_num; i++)
col_stat *= ;
for (int i = ; i < col_stat; i++)
{
int temp = i;
int row_bit[];
row_bit[] = row_bit[] = row_bit[] = ;
for (int j = ; j < col_num; j++)
{
row_bit[] <<= ;
row_bit[] <<= ;
row_bit[] <<= ;
row_bit[temp % ] |= ;
temp /= ;
}
bool conflict = false;
for (int j = ; j < ; j++)
if (!ok(row_bit[j]))
{
conflict = true;
break;
}
if (conflict)
continue;
status[status_cnt].last_bit_count = count_bit(row_bit[]);
for (int j = ; j < ; j++)
status[status_cnt].row_bit[j] = row_bit[j];
status_cnt++;
}
} void work()
{
for (int i = ; i < row_num - ; i++)
{
for (int j = ; j < status_cnt; j++)
{
int a = status[j].row_bit[];
int b = status[j].row_bit[];
int c = status[j].row_bit[];
bool conflict = false;
for (int k = ; k < ; k++)
if (!ok(status[j].row_bit[k], i + k))
{
conflict = true;
break;
}
if (conflict)
continue;
f[(i + ) % ][b][c] = max(f[(i + ) % ][b][c], f[i % ][a][b] + status[j].last_bit_count);
ans = max(ans, f[(i + ) % ][b][c]);
}
}
} int main()
{
input();
if (row_num == )
{
ans = ;
for (int i = ; i < ( << col_num); i++)
{
if (ok(i) && ok(i, ))
ans = max(ans, count_bit(i));
}
printf("%d\n", ans);
return ;
}
ans = ;
init();
make_stat();
work();
printf("%d\n", ans);
return ;
}

poj1185的更多相关文章

  1. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  2. poj1185(状态压缩DP)

    poj1185 题意 给出字母矩阵,只能在字母为 P 的位置放置大炮, 如图所示,每个大炮的射程固定,现在要求尽可能多的放大炮,且使得每个大炮都不在其它大炮的射程内.问最多能放多少. 分析 poj32 ...

  3. 【POJ1185】炮兵阵地(状压DP)

    题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...

  4. 【POJ1185】炮兵阵地 状压DP

    感觉总是被一些SB错误所困扰... 差不多还是(模板题)注意数组空间的大小,和对于合法状态的判断. f[i][j][k]=max(f[i][k][j],f[i-1][l][k]+num[j]) (f[ ...

  5. POJ1185 炮兵阵地

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

  6. POJ1185炮兵阵地(状态压缩 + dp)

    题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...

  7. POJ1185状态压缩DP

    难得的中文题. POJ1185http://poj.org/problem?id=1185 方法就是用DP[i][r][p]表示第i行状态为r,第i-1行状态是p时的最多个数.而这里p受到r的限制,而 ...

  8. POJ1185 - 炮兵阵地(状态压缩DP)

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

  9. [状压dp]POJ1185 炮兵阵地

    中文题 题意不再赘述 对于中间这个“P” 根据dp的无后效性 我们只需考虑前面的 就变成了 只需考虑: 也就是状压前两行 具体与HDOJ的4539类似: 看HDOJ 4539 仅仅是共存状态的判断不同 ...

随机推荐

  1. Pro Git 读书笔记

    一. 起步 1. 集中式版本控制缺点:中央服务器的单点故障. 分布式版本控制优点:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后 ...

  2. Java.util.ArrayList详解

    java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...

  3. Java基础-final变量和普通变量的区别

    当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再 ...

  4. C++ 11 线程的同步与互斥

    这次写的线程的同步与互斥,不依赖于任何系统,完全使用了C++11标准的新特性来写的,就连线程函数都用了C++11标准的lambda表达式. /* * thread_test.cpp * * Copyr ...

  5. 使用FMDB事务批量更新数据库

    今天比较闲看到大家在群里讨论关于数据库操作的问题,其中谈到了“事务”这个词,坦白讲虽然作为计算机专业的学生,在上学的时候确实知道存储过程.触发器.事务等等这些名词的概念,但是由于毕业后从事的不是服务器 ...

  6. BZOJ-1880 Elaxia的路线 SPFA+枚举

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...

  7. 【bzoj1013】 JSOI2008—球形空间产生器sphere

    www.lydsy.com/JudgeOnline/problem.php?id=1013 (题目链接) 题意 有一个n维的球体,给出球上n+1个点,求出圆心. Solution 题中给出了对于n维空 ...

  8. 如何在ECSHOP前台后台中讲版权内容清除

    如何在ECSHOP前台后台中讲版权内容清除 作者:河南电脑学校网 点击次数:1065 发布时间:2012-02-02 20:13:58 一.ECSHOP前台显示的页面的版权在下面几个地方修改:(本人不 ...

  9. 工具分享——将C#文档注释生成.chm帮助文档

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  10. HTML 5 应用程序缓存

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这 ...