poj1185
状态压缩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的更多相关文章
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- poj1185(状态压缩DP)
poj1185 题意 给出字母矩阵,只能在字母为 P 的位置放置大炮, 如图所示,每个大炮的射程固定,现在要求尽可能多的放大炮,且使得每个大炮都不在其它大炮的射程内.问最多能放多少. 分析 poj32 ...
- 【POJ1185】炮兵阵地(状压DP)
题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...
- 【POJ1185】炮兵阵地 状压DP
感觉总是被一些SB错误所困扰... 差不多还是(模板题)注意数组空间的大小,和对于合法状态的判断. f[i][j][k]=max(f[i][k][j],f[i-1][l][k]+num[j]) (f[ ...
- POJ1185 炮兵阵地
题目描述 Description 司令部的将军们打算在N × M的网格地图上部署他们的炮兵部队.一个N × M的地图由N行M列组成,地图的每一格可能是山地(用"H"表示),也可能是 ...
- POJ1185炮兵阵地(状态压缩 + dp)
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...
- POJ1185状态压缩DP
难得的中文题. POJ1185http://poj.org/problem?id=1185 方法就是用DP[i][r][p]表示第i行状态为r,第i-1行状态是p时的最多个数.而这里p受到r的限制,而 ...
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- [状压dp]POJ1185 炮兵阵地
中文题 题意不再赘述 对于中间这个“P” 根据dp的无后效性 我们只需考虑前面的 就变成了 只需考虑: 也就是状压前两行 具体与HDOJ的4539类似: 看HDOJ 4539 仅仅是共存状态的判断不同 ...
随机推荐
- Java设计模式-观察者模式(Observer)
包括这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承,学的时候应该 记得归纳,记得本文最开始的那个图.观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时, ...
- Java基础-数据类型转换
1).简单类型数据间的转换,有两种方式:自动转换和强制转换,通常发生在表达式中或方法的参数传递时. 自动转换 当一个较"小"数据与一个较"大"的数据一起运算 ...
- web开发(二十一)之自定义拦截器的使用
转自博客:http://blog.csdn.net/pkgk2013/article/details/51985817 拦截器的作用 拦截器,在AOP(Aspect-Oriented Programm ...
- iOS之单例
今天在看多线程同步时,突然想到了单例的同步问题.自从dispatch_once出现后,我们创建单例非常简单且安全: static dispatch_once_t pred; static Single ...
- codevs1500 后缀排序
题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...
- TCP/IP详解 学习六
从ip层看路由表 选路策略 选路策略:决定把哪些路由放到路由表的规则. Ip执行选路机制,而路由守护程序则提供选路策略. Netstat –rn 打印路由表,如果没有-n命令会搜索配置文件,将网络地 ...
- android.net.wifi的简单使用方法
获取Wifi的控制类WifiManager. WifiManager wm=(WifiManager)getSystemService(Context.WIFI_SERVICE); 接下来可以对w ...
- arp绑定网关MAC地址错误
为了防止局域网的arp 要绑定网关MAC地址 在vista/win中 用 arp -s 绑定网关会出现错误 ARP 项添加失败 C:\Users\sink>arp -a 接口: 10.200.5 ...
- Linux创建用户命令
创建用户.设置密码.修改用户.删除用户: useradd testuser 创建用户testuser passwd testuser 给已创建的用户testuser设置密码 说明:新创建的用户 ...
- 安装coreseek找不到mysql
1.安装 coreseek-3.2.14 遇到问题:“ERROR: cannot find MySQL include files,随即在网上搜索各种答案说是要找到mysql.h的正确路径加入./co ...