状态压缩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. 畅所欲言第1期 - 从Viola&Jones的人脸检测说起

    转载自http://c.blog.sina.com.cn/profile.php?blogid=ab0aa22c890006v0 不少人认识我或者听说我的名字都是因为我过去做的关于人脸检测的工作,那么 ...

  2. 洛谷P1417 烹调方案

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  3. debian , ubuntu 截取下拉菜单

    普通情况下print键很好用的,但是,截下拉菜单的时候,就怎么按都没反应了...然后换了shutter也不行,只能在静态界面截图.所以...然后就有了下面方法. 如果不是gnome怎么办?这个担心显然 ...

  4. vs配置

    每次遇到vs配置都要让我头疼一段时间,对于某些不太清楚,有时自己试着配置,能运行起来就行,下次又忘了咋陪的了,其中配置的东西真心多. 1.输出目录这样配置../../Bin/Server/ 这个路径是 ...

  5. java中获取路径中的空格处理(%20)问题

    在java中获取文件路径的时候,有时候会获取到空格,但是在中文编码环境下,空格会变成“%20”从而使得路径错误. 解决办法: String path = Parameter.class.getReso ...

  6. Shell脚本获得变量值作为新变量一部分的值

    最近使用shell写一个发布脚本时,由于shell编程是边学便用的缘故,经验不足,中间遇到一个问题,一个变量的值作为一个新变量的一部分,而我要根据变量获得新变量的值,以前没有遇到过.网络搜索一番,最后 ...

  7. ccleaner注册码

    名称:Registered User 密钥:CBB4-FJN4-EPC6-G5P6-QT4C 先不要启动程序,然后断网注册.

  8. prototype.js $F()函数介绍

    $F()是一个能够简化编码量的函数, 对于字段输入控件有效,包括input.textarea.select等,该函数的输入参数为这些输入控件元素对象的id或元素对象本身,函数负责返回 这些输入控件元素 ...

  9. Struts2中基于Annotation的细粒度权限控制

    Struts2中基于Annotation的细粒度权限控制 2009-10-19 14:25:53|  分类: Struts2 |  标签: |字号大中小 订阅     权限控制是保护系统安全运行很重要 ...

  10. Linux无法使用userdel删除用户和组的解决办法

    转自:http://www.linuxidc.com/Linux/2013-07/87371.htm 简述: 今天在看书的时候,看到有个实例,手痒痒的跟着做了起来...但是,出现问题了..测试的用户和 ...