poj 1185 状压dp+优化
http://poj.org/problem?id=1185
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 29176 | Accepted: 11303 |
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<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
int e[][];
int f[][][];
int N,M,tot,all;
int a[],t[];
int g[][];
int _g[][];
int sol(int x)
{
int r=;
for(int j=;j<M;++j)
{
if(x&(<<j)) {
r++;
for(int i=-;i<=;++i)
{
if(i==||j+i<||j+i>=M) continue;
if(x&(<<(j+i))) return -;
}
}
}
return r;
}
void init()
{
for(int i=;i<all;++i)
{
int x=sol(i);
if(x!=-){
a[tot]=i;
t[tot++]=x;
}
}
}
bool ok(int _a,int x)
{
int A=a[_a];
for(int i=;i<M;++i)
if((A&(<<i))&&e[x][M-i]) return ;
return ;
}
bool match(int _a,int _b)
{
int A=a[_a],B=a[_b];
for(int i=;i<M;++i)
if((A&(<<i))&&(B&(<<i))) return ;
return ;
}
int main()
{
int i,j,k=;
while(scanf("%d%d",&N,&M)==){tot=;
all=(<<M);memset(e,,sizeof(e));
memset(f,,sizeof(f));
memset(g,-,sizeof(g));
memset(_g,-,sizeof(_g));
for(i=;i<=N+;++i)
for(j=;j<=M;++j){
char c;
scanf(" %c",&c);
e[i][j]=c=='P'?:;
}
init();
for(i=;i<tot;++i)
for(j=;j<=N+;++j)
_g[i][j]=ok(i,j);
for(i=;i<tot;++i)
for(j=;j<tot;j++)
g[i][j]=match(i,j);
for(i=;i<=N+;++i)
{
for(int t1=;t1<tot;++t1)
{
if(!_g[t1][i-]) continue;
for(int t2=;t2<tot;++t2)
{
if(!_g[t2][i-]||!g[t1][t2]) continue;
for(int t3=;t3<tot;++t3)
{
if(!_g[t3][i]||!g[t2][t3]||!g[t1][t3]) continue;
if(f[i][t2][t3]<f[i-][t1][t2]+t[t3])f[i][t2][t3]=f[i-][t1][t2]+t[t3];
}
}
}
}
int ans=;
for(int t1=;t1<tot;++t1)
for(int t2=;t2<tot;++t2)
if(ans<f[N+][t1][t2])ans=f[N+][t1][t2];
printf("%d\n",ans);
}
return ;
}
poj 1185 状压dp+优化的更多相关文章
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- 炮兵阵地(POJ 1185状压dp)
题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...
- POJ1038 Bugs Integrated, Inc 状压DP+优化
(1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...
- POJ 3254 (状压DP) Corn Fields
基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...
- poj 1170状压dp
题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...
- hdu 1185 状压dp 好题 (当前状态与上两行有关系)
/* 状压dp 刚开始&写成&&看了好长时间T0T. 状态转移方程 dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[i][j]);( ...
- POJ 2411 状压DP经典
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16771 Accepted: 968 ...
- POJ 3254 状压DP
题目大意: 一个农民有一片n行m列 的农场 n和m 范围[1,12] 对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
随机推荐
- [NOIP2018TG]旅行
[NOIP2018TG]旅行 树很简单,对每个点sort儿子,贪心走就行了 基环树呢? 如果是1e5可能不太好做 但是5000的话枚举断边就可以\(n^2\)了 #include<bits/st ...
- django实现密码非加密的注册(数据对象插入)
数据模型 from django.db import models class userinfo(models.Model): username = models.CharField(max_leng ...
- speech sdk 文字转语音
1.下载SDK包 https://www.microsoft.com/en-us/download/details.aspx?id=10121 2.直接上代码 // SpeechRecognition ...
- python函数回顾:setattr()
描述 setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. 语法 setattr 语法: setattr(object, name, value) 参数 object -- ...
- python面试题(三)
1 一行代码实现9*9乘法表 print ("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y ...
- 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!
在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...
- Python进阶(1)_Socket网络编程(基于tcp的socket)
网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...
- Centos(Yum源更改)
第一步:备份你的原镜像文件,以免出错后可以恢复. [root@openstack yum.repos.d]#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum. ...
- Python框架之Tornado(二)预备知识epoll最好的讲解
问:epoll 或者 kqueue 的原理是什么?为什么 epoll 和 kqueue 可以用基于事件的方式,单线程的实现并发?我没看过 linux 内核,对这方面一直有疑问…… 必须从很多基础的概念 ...
- Linux服务器iops性能测试-iozone
1. 选用工具: iozone 下载地址:http://www.iozone.org/ (直接下载rpm包) 2. 工具安装: 执行命令: rpm -ivh iozone-3-40 ...