当前位置: 首页 > 编程日记 > 正文

POJ 1185 炮兵阵地 (状压DP)

炮兵阵地
Time Limit: 2000MSMemory Limit: 65536K
Total Submissions: 14869Accepted: 5575

Description

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。

Input

第一行包含两个由空格分割开的正整数,分别表示N和M; 
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。

Output

仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。

Sample Input

5 4
PHPP
PPHH
PPPP
PHPP
PHHP

Sample Output

6

Source

Noi 01
  1. 题意:在一个n行m列的矩阵中,字符'P'处能放炮兵,字符'H'处不能放炮兵。
  2.       并且如果两个炮兵在一条(水平或垂直)直线上时,它们的距离不能小于2,问最多放多少个兵。
  3. 由于在求第i行时,它的状态要收到第i-1行和i-2行的影响,所以定义一个三维dp:
  4. dp[i][j][k]表示第i行的状态为state[j],第i-1行的状态为state[k]时,前i行能放炮兵的最大数量。
  5. for ( ... i < n ...)
  6. {
  7.     for ( ... j < nState ... )
  8.     {
  9.         如果状态j和第i行的地形不冲突,那么:
  10.         for ( ... k < nState ... )
  11.         {
  12.             如果第i行状态j和第i-1行状态k不冲突,那么:
  13.             for ( ... h < nState ... )
  14.             {
  15.                 如果第i行状态j和第i-2行状态h不冲突,那么:
  16.                 在dp[i-1][k][h]中找最大的一个赋值给dp[i][j][k],再加上state[j]中1的个数
  17.             }
  18.         }
  19.     }
  20. }

#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;int n,m;
int dp[110][80][80];    //dp[i][j][k]表示第i行的状态为j,第i-1行的状态为k时能放炮兵的最大数量 
int cnt,state[80],row[110],num[80]; //10位二进制位中各个1之间的距离不小于2,这样的数只有60个//依次存放在state[]中,num[i]表示state[i]中1的个数
char str[15];void init(){    //在小于2^m的数中找1之间的距离不小于2的数,保存在state[]中cnt=0;for(int i=0;i<(1<<m);i++)if((i&(i<<1))==0 && (i&(i<<2))==0){state[cnt]=i;num[cnt]=0;int tmp=i;while(tmp){num[cnt]+=(tmp&1);tmp>>=1;}cnt++;}
}int main(){//freopen("input.txt","r",stdin);/*  求出符合条件(不在攻击范围之类)的总数,,p=60int p=0;for(int i=0;i<(1<<10);i++)if((i&(i<<1))==0 && (i&(i<<2))==0){p++;}printf("p=%d \n",p);*/while(~scanf("%d%d",&n,&m)){init();for(int i=0;i<n;i++){scanf("%s",str);row[i]=0;for(int j=0;j<m;j++)if(str[j]=='P')row[i]+=(1<<j);}memset(dp,0,sizeof(dp));for(int j=0;j<cnt;j++)  // 计算dp[0]if((row[0]&(state[j]))==state[j])for(int k=0;k<cnt;k++)dp[0][j][k]=num[j];if(n>1){    // 计算dp[1] for(int j=0;j<cnt;j++)if((row[1]&state[j])==state[j])for(int k=0;k<cnt;k++)if((state[j]&state[k])==0)dp[1][j][k]=dp[0][k][0]+num[j];}for(int i=2;i<n;i++)    // 计算dp[>1]for(int j=0;j<cnt;j++)if((row[i]&state[j])==state[j]) //如果状态j和第i行的地形不冲突for(int k=0;k<cnt;k++)if((state[j]&state[k])==0){  //如果第i行状态j和第i-1行状态k不冲突for(int h=0;h<cnt;h++)if((state[j]&state[h])==0)  //如果第i行状态j和第i-2行状态h不冲突dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][h]);dp[i][j][k]+=num[j];}int ans=0;for(int j=0;j<cnt;j++)  // 在dp[n-1]中找最大值 for(int k=0;k<cnt;k++)if(ans<dp[n-1][j][k])ans=dp[n-1][j][k];printf("%d\n",ans);}return 0;
}

相关文章:

不雅测发挥分析Android在美智能机市场凌驾黑莓及苹果

网易科技讯 3月4日动静&#xff0c;根据尼尔森公司比来宣布的陈诉发挥分析&#xff0c;Android操纵体系以29%的市占率在美国智好手机市场凌驾黑莓(27%)和苹果(27%)。其中&#xff0c;宏达电占12%&#xff0c;摩托罗拉占10%&#xff0c;三星占5%。但从厂商角度来看&#xff0c;苹…

Java基础-常量,变量,成员变量,局部变量

在java中&#xff0c;数据是以常量和变量两种方法形式进行存储和表示的&#xff08;实际上&#xff0c;所有程序的数据都是这两种形式&#xff09;。 变量 变量代表程序的状态。程序通过改变变量的值来改变整个程序的状态&#xff0c;或者说得更大一些&#xff0c;也就是实现程…

把eclipse从英文调整为中文

鼠标右键单击桌面上的快捷方式&#xff0c;选择文件所在位置 选择配置设置 eclipse.ini 在最后加上 -Duser.languageen 然后重启eclipse即可

关系数据理论中的范式

标准化表示从你的数据存储中移去数据冗余(redundancy)的过程。如果数据库设计达到了完全的标准化&#xff0c;则把所有的表通过关键字连接在一起时&#xff0c;不会出现任何数据的复本(repetition)。标准化的优点是明显的&#xff0c;它避免了数据冗余&#xff0c;自然就节省了…

无法在证书存储区中找到清单签名证书的解决办法

以前的一个项目今天打开忽然提示说“无法在证书存储区中找到清单签名证书”&#xff0c;很郁闷&#xff0c;不知道怎么回事。最好在 工程属性里面&#xff0d;&#xff0d;签名&#xff0d;&#xff0d;为Clickonce清单签名 去掉 。再次生成居然成功了。不知道具体什么原因引起…

Linux Centos 上一些常用的命令

1、查看端口被哪个进程占用 netstat -lnp | grep <端口号> 2、查看某个进程号详细信息 ps <进程号> 3、检查指定服务是否开启&#xff08;例如 telnet&#xff09; chkconfig --list | grep telnet chkconfig iptables on &#xff08;打开某个服务器自启动&#…

eclipse提示在***类中找不到main方法

可能是因为注释加的太多了&#xff0c;在代码最开始的时候 这时候&#xff0c;把注释删掉就可以了 就像这样&#xff0c;这时候不要惊慌&#xff0c;先看一下是不是注释太多了&#xff0c;如果不是的话&#xff0c;请百度搜索解决办法

【随记】动态调用web服务

通常我们在程序中需要调用WebService时&#xff0c;都是通过“添加Web引用”&#xff0c;让VS.NET环境来为我们生成服务代理&#xff0c;然后调用对应的Web服务。这样是使工作简单了&#xff0c;但是却和提供Web服务的URL、方法名、参数绑定在一起了&#xff0c;这是VS.NET自动…

在博客中加入“花絮”效果

在博客中加入Snap Shots Snap Shots表示“花絮”的意思&#xff0c;在博客中可以使用Snap Shots来添加“花絮”效果。先演示一遍效果&#xff0c;看是否能用&#xff1a;http://www.cnblogs.com/psunny内部的链接Snap Shots效果不可用 http://www.google.cn外部的链接Snap Shot…

phonegap调用摄像头

phonegap的HTML5的代码 是通用的 自己写了个 可是发现 在安卓机上市可以实现拍照的 但是iOS上却不行 这是为什么 我一直不解 document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { document.addEventListener(&quo…

关于JDBC中的 PreparedStatement 的使用讲解

**关于JDBC中的 PreparedStatement 的使用讲解**TOC 文章转载于博客 https://www.cnblogs.com/ysw-go/p/5459330.html 如有侵权&#xff0c;联系删除

SQLite数据转换成sql server数据

需要将SQLite数据库里的数据导入到SQL Server&#xff0c;在网上搜了好久&#xff0c;没有找到一个方便实用的方法。 经过本人的细心琢磨实验&#xff0c;终于让我给找到一好的方法&#xff1a;使用CSV文件作为介质来做转换。现在记录下来&#xff0c;一是小小庆祝一下&#xf…

Animation Override Controller动画重载器

假设游戏有很多个小人, 每一个人有2种动画站立,跑. 在通常情况下每一个人物都需要一个动画控制器。 有没有想过定义一个动画控制器 无须在定义全新的动画充值器实现每一个小人都播放自己的动画呢&#xff1f;没错Animation Oveeride Controller就是来解决这个问题的 1. 我们设…

java连接mysql8的坑

变化&#xff1a; 1.Class.forName(“com.mysql.cj.jdbc.Driver”); 2.connDriverManager.getConnection(“jdbc:mysql://localhost/数据库名字?serverTimezoneUTC”,“root”,“密码”); package chap01;import java.sql.Connection; import java.sql.DriverManager; import…

Oracle用户管理

创建用户create user–概述&#xff1a;在oracle中要创建一个新的用户使用 create user 语句,一般是具有dba(数据库管理员)的权限才能使用。–基本语法&#xff1a;create user 用户名 identified by 密码create user dbuser1 identified by dbuser1; 用户赋权grant–概述&…

UNIX网络编程--ioctl操作(十七)

一、概述 在本书中有两个地方都对这个函数进行了介绍&#xff0c;其实还有很多地方需要这个函数。ioclt函数传统上一直作为纳西而不适合归入其他精细定义类别的特性的系统接口。网络程序&#xff08;特别是服务器程序&#xff09;经常在程序启动执行后使用ioctl获取所在主机全部…

Servlert接口的doGet()、doPst()方法

Serlvet接口只定义了一个服务方法就是service&#xff0c;而HttpServlet类实现了该方法并且要求调用下列的方法之一&#xff1a; doGet&#xff1a;处理GET请求 doPost&#xff1a;处理POST请求 当发出客户端请求的时候&#xff0c;调用service 方法并传递一个请求和响应对象&a…

Web服务器 之 Apache 2.x 服务器中的URL重写的配置和应用

作者&#xff1a;北南南北来自&#xff1a;LinuxSir.Org摘要&#xff1a; 本文是关于Apache 2.x 服务器中的URL别名规则的文档&#xff0c;它是通过rewrite模块来实现的。能过URL别名规则&#xff0c;我们能看到一个干净的URL&#xff0c;比如可以重写为类似静态网页的地址。比…

杜拉拉的作者李可应北大就业指导中心之约写给大学生的一封信

本文是杜拉拉的作者李可应北大就业指导中心之约写给大学生的一封信。 北大的同学们&#xff0c;大家好&#xff1a;又到了临近毕业的日子&#xff0c;年复一年&#xff0c;在这个梦想周期性遭遇现实的季节&#xff0c;对一代又一代的莘莘学子而言&#xff0c;在精神上和身体上准…

VLC架构及流程分析

0x00 前置信息 VLC是一个非常庞大的工程&#xff0c;我从它的架构及流程入手进行分析&#xff0c;涉及到一些很细的概念先搁置一边&#xff0c;日后详细分析。 0x01 源码结构&#xff08;Android Java相关的暂未分析&#xff09; # build-android-arm-linux-androideabi/&#…

eclipse运行程序时只有run on server

最近写jsp的程序比较多&#xff0c;写java程序时&#xff0c;发现一点击运行按钮就开始启动服务器了&#xff0c; 这是因为没有写主函数的原因 注意这个问题

自动生成小学四则运算题目的程序.心得体会

http://t.cn/RAS67B0 源代码 #include<stdio.h> #include<stdlib.h>#include<time.h>main(){int a,b,op,os; printf(" [天天练&#xff0c;Baby们来挑战吧!]\n");aq1: printf("选择您想挑战的运算法则\n");printf("1.加法 2.减法 3…

试图运行项目时出错,无法启动调试。没有正确安装调试器,请运行安装程序安装或恢复调试器。...

用Visual Studio.net 2003调试项目时&#xff0c;出现错误对话框&#xff0c;显示如下&#xff1a;试图运行项目时出错&#xff0c;无法启动调试。没有正确安装调试器&#xff0c;请运行安装程序安装或恢复调试器。解决方法如下&#xff1a; 1、在命令行中尝试重新注册m…

Memcached, Redis, MongoDB区别

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库&#xff0c;其优势在于查询功能比较强大&#xff0c;能存储海量数据。mongodb和memcached不存在谁替换谁的问题。和memcached更为接近的是redis。它们都是内存型数据库&#xff0c;数据保存在内存中&…

idea使用maven创建java工程log4j的配置

错误&#xff1a;在pom.xml文件中 project下有下划线&#xff0c;报错 改正&#xff1a; <!-- 配置日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency&g…

kaggle预测

两个预测kaggle比赛 一 .https://www.kaggle.com/c/web-traffic-time-series-forecasting/overview Arthur Suilin•(1st in this Competition)•a year ago•Options github&#xff1a;https://github.com/sjvasquez/web-traffic-forecasting My model is basically RNN seq2…

PHP开发中,让var_dump调试函数输出更美观 ^_^#

前提&#xff1a;php必须安装Xdebug模块。 用var_dump打印输出时&#xff0c;输出的内容没有被格式化。如下图&#xff1a; 通常使用var_dump打印的内容是被格式化后输出的&#xff0c;如下图&#xff1a; 造成没有格式化输出的原因是因为php.ini设置的问题&#xff0c;使用php…

@Override is not allowed when implementing interface method

用idea打开项目&#xff0c;有下划线 解决办法&#xff1a; 选中出现红色下划线的项目&#xff0c;右键单击&#xff0c;选择open module settings 将language level改为8-Lambdas… 点击apply 选择projects&#xff0c;进行更改 点击apply 点击ok 即可

C#发现之旅第一讲 C#-XML开发

C#发现之旅第一讲 C#&#xff0d;XML开发 袁永福 2008-5-15 系列课程说明 为了让大家更深入的了解和使用C#&#xff0c;我们将开始这一系列的主题为“C#发现之旅”的技术讲座。考虑到各位大多是进行WEB数据库开发的&#xff0c;而所谓发现就是发现我们所不熟悉的领域&#xff…

页面的前进/后退/刷新方法

前进一页 οnclick"javascript:window.history.forward()" 后退一页 οnclick"javascript:window.history.back();" 前进/后退 n页 n为正是前进,负数是后退 onclick"javascript:window.history.go(n);" 刷新 οnclick"window.location.re…