poj1185 炮兵阵地【状压DP】
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 32802 | Accepted: 12650 |
Description

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6
Source
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring> using namespace std;
typedef long long LL;
#define inf 0x3f3f3f3f const int maxn = ;
int n, m, mostm;
int dp[maxn][][], dixing[maxn];
int cntone[], S[], cnt; bool valid(int i, int x)
{
if (dixing[i] & x)return false;
else return true;
} int get_one(int x)
{
int res = ;
while (x) {
res += (x & );
x >>= ;
}
return res;
} bool ok(int x)
{
if (x & (x << ))return false;
if (x & (x << )) return false;
return true;
} void getS()
{
cnt = ;
mostm = << m;
for (int i = ; i < mostm; i++) {
if (ok(i)) {
S[cnt] = i;
cntone[cnt] = get_one(i);
cnt++;
}
}
} int main()
{
while (scanf("%d%d", &n, &m) != EOF) {
getS();
memset(dixing, , sizeof(dixing));
for (int i = ; i <= n; i++) {
char tmp[];
scanf("%s", tmp);
//printf("%s", tmp + 1);
for (int j = ; j < m; j++) {
//cout<<tmp[j]<<endl;
if (tmp[j] == 'H') {
dixing[i] |= ( << (m - - j));
}
}
} memset(dp, -, sizeof(dp));
dp[][][] = ;
int ans = ;
for (int j = ; j < cnt; j++) {
if (valid(, S[j])) {
dp[][j][] = cntone[j];
ans = max(ans, dp[][j][]);
}
}
//cout<<1<<" "<<ans<<endl; for (int i = ; i <= n; i++) {
int tiaoshi = -;
for (int j = ; j < cnt; j++) {
if (valid(i, S[j])) {
for (int k = ; k < cnt; k++) {
if (valid(i - , S[k]) && (S[j] & S[k]) == ) {
int mmm = -;
for (int l = ; l < cnt; l++) {
if (valid(i - , S[l]) && dp[i - ][k][l] != - && (S[j] & S[l]) == ) {
mmm = max(mmm, dp[i - ][k][l]);
}
}
//cout<<i - 1<<" "<<mmm<<endl;
dp[i][j][k] = max(dp[i][j][k], mmm + cntone[j]);
tiaoshi = max(tiaoshi, dp[i][j][k]);
if (i == n)ans = max(ans, dp[i][j][k]);
}
}
}
}
//cout<<i<<" "<<tiaoshi<<endl;
}
printf("%d\n", ans);
} //return 0;
}
poj1185 炮兵阵地【状压DP】的更多相关文章
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- poj1185 炮兵阵地 状压dp
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示) ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- 炮兵阵地 /// 状压DP oj26314
题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...
随机推荐
- 【转】【Mysql】MySQL添加用户、删除用户与授权
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...
- python 向qq邮箱发邮件
#coding:utf-8 ''' Created on 2017-1-12 @author: xiaochun ''' import smtplib from email.mime.text imp ...
- 多种方法实现div两列等高(收集整理)
HTML骨架 <div id="header">头部</div> <div id ="container"> <div ...
- 【转】StackOverflow程序员推荐:每个程序员都应读的30本书
“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语. ...
- 【Java面试题】51 什么时候用assert。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制. 在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保 ...
- php常见的坑
10.filesize缓存的问题 PHP的filesize居然会缓存(当然还有不少,这里仅用filesize举例,其它会缓存的函数,以官方文档为准)线上代码经常随机出各种问题,排查了1个月,线上加各种 ...
- Unity战斗系统之AI自主决策
http://www.taikr.com/course/448/tasks http://www.xuanyusong.com/archives/1840 http://www.cnblogs.com ...
- downtown uptown
Downtown is a term primarily used in North America by English speakers to refer to a city's core (or ...
- 制作SD卡启动自己编译的uboot.bin
README for FriendlyARM Tiny4412 -----------------------------------------------------1. Build uboot ...
- 50个Android开发技巧(03 自己定义ViewGroup)
问题:怎样创建一个例如以下图所看到的的布局? 图1 (原文地址:http://blog.csdn.net/vector_yi/article/details/244155 ...