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 仅仅是共存状态的判断不同 ...
随机推荐
- 模拟Modbus协议问题
问题: 在嵌入式系统开发中,Modbus协议是工业控制系统中广泛应用的一种协议.本题用来简单模拟Modbus协议,只需根据条件生成符合该协议的数据帧,并解析所获取的数据.假设设备使用的协议发送数据格式 ...
- 粒子群优化算法-python实现
PSOIndividual.py import numpy as np import ObjFunction import copy class PSOIndividual: ''' individu ...
- codeforces 715B:Complete The Graph
Description ZS the Coder has drawn an undirected graph of n vertices numbered from 0 to n - 1 and m ...
- HDU #5507 GT and Strings
这是AC自动机系列的第一篇 传送门 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Othe ...
- easyui之datagrid的使用
http://www.cnblogs.com/ruanmou001/p/3840954.html 一.神马是easyui jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery ...
- javascript中this的学习总结
在开发中,this多使用在function函数中,也正是由于调用function的对象的不同,才导致了this的指向不同.需要明白(1).function也是对象:(2).function执行时是在某 ...
- iphone6 wifi自动断开 tplink
这样设置就好了,不会自动断开 了
- 字符串数组元素排列与组合的Java递归实现
我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串ab ...
- MATLAB对话框设计[转]
Matlab之对话框 对话框设计:在图形用户界面程序设计中,对话框是重要的信息显示和获取输入数据的用户界面对象. 1.公共对话框: 公共对话框是利用windows资源的对话框,包括文件打开.文件保存. ...
- 新浪微博的XSS漏洞攻击过程详解
今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建 党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉 ...