poj1185炮兵阵地
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string> using namespace std; const int MAXN = 100 + 1; //阵地行数
const int MAXM = 10 + 1; //阵地列数
const int State_Num = 60 + 1; //阵地列状态的压缩总数,合法状态总数最多60 int dp[MAXN][State_Num][State_Num], cur[MAXN], state[State_Num], tot;
char field[MAXN][MAXM]; //储存阵地
int n, m; //阵地规模 /*
因为n <= 100, m <= 10,将阵地的列压缩。
dp[i][j][k]表示当第i行布置结束后,第i行的布置状态为j的情况下,
第i - 1行的状态为k,所能布置的最多的炮兵。 依据题意,我们能够删除一些状态。
删除的状态有:
1.山地不能布置炮兵
2.炮兵不能在垂直和水平的线上两格相邻。
cur[]数组用于储存输入的合法局面
state[]数组用于储存相邻的合法局面
*/ bool ok(int x)
{
return !((x & (x << 1)) || (x & (x << 2)));
} void init() //保留不两格相邻的
{
int limit = (1 << m);
tot = 0; for (int i = 0; i < limit; i++)
{
if (ok(i)) state[tot++] = i;
}
} bool yes(int x, int i)
{
return !(x & cur[i]);
} int cal(int x)
{
int res = 0;
while (x)
{
if (x & 1) res++;
x >>= 1;
}
return res;
} void input()
{
while (scanf("%d %d", &n, &m) != EOF) //输入
{
init();
memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++)
{
scanf("%s", field[i]), cur[i] = 0;
for (int j = 0; j < m; j++)
if (field[i][j] == 'H') cur[i] += (1 << (m - j - 1)); //用于推断状态是否合法(1)
} for (int i = 0; i < tot; i++) //初始化第一行
{
if (!yes(state[i], 0)) continue;
for (int j = 0; j < tot; j++)
{
dp[0][i][j] = cal(state[i]);
}
} for (int i = 1; i < n; i++) //计算当前行,枚举上两行的状态
{
for (int j = 0; j < tot; j++) //枚举当前行的状态
{
if (!yes(state[j], i)) continue;
for (int k = 0; k < tot; k++)
{
if (!yes(state[k], i - 1)) continue;
for (int l = 0; l < tot; l++)
{
if (!yes(state[l], i - 2)) continue;
if (((state[j] & state[k]) == 0) && ((state[j] & state[l]) == 0) && ((state[k] & state[l]) == 0))
{
dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][l] + cal(state[j]));
}
}
}
}
} int ans = 0; //计算答案 for (int i = 0; i < tot; i++)
for (int j = 0; j < tot; j++)
ans = max(ans, dp[n - 1][i][j]); cout << ans << endl;
}
} int main()
{
input();
return 0;
}
poj1185炮兵阵地的更多相关文章
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- POJ1185炮兵阵地【动态规划】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26892 Accepted: 10396 Descriptio ...
- poj1185 炮兵阵地【状压DP】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32802 Accepted: 12650 Descriptio ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- POJ1185 炮兵阵地 和 POJ2411 Mondriaan's Dream
炮兵阵地 Language:Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34008 Accepted ...
- POJ1185 炮兵阵地
题目描述 Description 司令部的将军们打算在N × M的网格地图上部署他们的炮兵部队.一个N × M的地图由N行M列组成,地图的每一格可能是山地(用"H"表示),也可能是 ...
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ1185 炮兵阵地 状态压缩
因为不知道不同的博客怎么转,就把别人的复制过来了,这个题解写的非常好,原地址为: http://hi.baidu.com/wangxustf/item/9138f80ce2292b8903ce1bc7 ...
- poj1185炮兵阵地 正确代码及错误代码分析
Solution:状态压缩 因为设置炮兵的局限性(同行两炮兵相差要大于2),一行10个数最多有60种可能性(程序计算) 其中判断可能性的好方法是: if ((i & (i << 1 ...
随机推荐
- linux下远程管理利器-tmux
linux下远程管理利器-tmux 1.控制键 控制键就是tmux的主键.当你在tmux环境下按下这个键的时候,tmux就会把你后面输入的指令,解析成它内置的功能.tmux默认的控制键是 ...
- 【翻译】在Ext JS和Sencha Touch中创建自己定义布局
原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...
- anthelion编译
编程工程 $ cd ./anthelion/anthelion/target/classes$ java -Xmx15G -cp ../Anthelion-1.0.0-jar-with-depende ...
- Windows查看进程taskList,终止进程tskill
TaskList: 列出当前所有运行进程. 使用方法:在命令提示符中输入tasklist 然后回车,会看到类似下面的列表: 映像名称 ...
- codeforces 598B Queries on a String
题目链接:http://codeforces.com/problemset/problem/598/B 题目分类:字符串 题意:给定一个串,然后n次旋转,每次给l,r,k,表示区间l到r的字符进行k次 ...
- 14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置
14.3.3 Locks Set by Different SQL Statements in InnoDB 不同的SQL语句在InnoDB里的锁设置 locking read, 一个UPDATE,或 ...
- java图形
JFreeCharteclipse图形化编程插件jigloojfaceibm的jface基于swt,swing解决了awt存在的lcd问题.swing组件:container,window,frame ...
- php 简易验证码(GD库)
论坛中为了防止灌水,出现了非常多的验证码的插件.如今这里介绍一个非常easy的自己定义验证码函数,这个验证码实现的原理就是通过php扩展的gd库来实现的. 给出百度百科对验证码的定义"验证码 ...
- hdu1896之优先队列应用
Stones Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Sub ...
- Windows - Windows的文件名的全路径(Fully Qualified File Name)的最大长度为260字节
例如,你可以做以下实验来验证这个限制值: 在随意文件夹下新建一个文件夹. 在该新建文件夹下创建一个随意文件.使其名字长度不能再输入为止. 把该文件的全路径名copy到Microsoft Word中进行 ...