poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185
思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到递推方程:dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+num[j]);(其中num[j]为该状态下可以放置的士兵的个数。至于具体怎么分析,这位大牛讲的很清楚:http://www.cnblogs.com/scau20110726/archive/2013/02/27/2935256.html
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int dp[][][];
int row[];
int s[<<];//保存所有士兵合法的状态
int num[<<];
int n,m,ans,state;
char str[]; int Get_Num(int x)
{
int cnt=;
while(x>){
cnt++;
x=x&(x-);
}
return cnt;
} int main()
{
while(~scanf("%d%d",&n,&m)){
memset(row,,sizeof(row));
memset(dp,,sizeof(dp));
memset(num,,sizeof(num));
for(int i=;i<n;i++){
scanf("%s",str);
for(int j=;j<m;j++){
if(str[j]=='H')row[i]=(row[i]<<)|;
else row[i]<<=;
}
}
state=;
for(int i=;i<(<<m);i++){
if((i&(i<<))||(i&(i<<)))continue;
s[state]=i; //合法状态
num[state++]=Get_Num(i);//可以放置的士兵个数
}
for(int i=;i<state;i++){
if(s[i]&row[])continue;
dp[][i][]=num[i];
}
for(int i=;i<n;i++){
for(int j=;j<state;j++){
if(row[i]&s[j])continue;
for(int k=;k<state;k++){
if(s[j]&s[k])continue; //i行与i-1行士兵相互攻击
for(int l=;l<state;l++){
if(s[j]&s[l])continue;//i行与i-2行士兵相互攻击
if(s[k]&s[l])continue;//i-1行与i-2行士兵相互攻击
dp[i][j][k]=max(dp[i][j][k],dp[i-][k][l]+num[j]);
}
}
}
}
ans=;
for(int i=;i<state;i++){
for(int j=;j<state;j++){
ans=max(ans,dp[n-][i][j]);
}
}
printf("%d\n",ans);
}
return ;
}
poj 1185(状压dp)的更多相关文章
- poj 1185 状压dp+优化
http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 291 ...
- 炮兵阵地(POJ 1185状压dp)
题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...
- 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 3254 状压DP
题目大意: 一个农民有一片n行m列 的农场 n和m 范围[1,12] 对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...
- POJ 2411 状压DP经典
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16771 Accepted: 968 ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- poj 2923 状压dp+01背包
好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...
随机推荐
- Shell 传递参数(转)
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 以下实例我们向脚本传递三 ...
- 01-hibernate注解:类级别注解准备工作
注解简介: 目的:为了简化繁琐的ORM映射文件(.hbm)的配置. JPA与hibernate的关系 JPA:全称 java Persistence API(java持久化API接口) JPA注解是J ...
- 基于mybatis-generator代码生成工具改(链式方法实体版)
概述 一直以来使用原生mybatis-generator的我发现有一个地方很不方便,即它生成的实体类的set方法返回值是void,而目前比较流行的则是链式set的写法,即set方法返回值不再是void ...
- jumpserver v0.5.0 创建用户和管理机器
用户管理-创建用户 data 用户详情 如下 创建用户组 data 资产列表添加资产 jumpserver 的 root 公钥需保持到 后端服务器的 authorized_keys 里, 然后测 ...
- 关于UML图形/图示数量总结
http://www.uml.org/ 第一种说法: UML - Unified Modeling Language UML 共定义了9种图,包括4种结构图和5种形为图: //4种结构图: 类图 对象 ...
- 使用C#开发ActiveX控件[Obsolete]
文章出处:http://www.cnblogs.com/yilin/archive/2009/09/15/1567332.html 附件下载(源代码+安装文件+教程) 0. 前言 ActiveX控件以 ...
- js setInterval()函数 [倒计时用]
定义和用法: setInterval() 方法用于在指定的毫秒数后调用函数或计算表达式.它与setTimeout()方法不同的是前者可以无限的循环,不会受调用函数的限制,要想退出此循环可 ...
- 2.请求库之requests
requests模块阅读目录: 介绍 基于GET请求 基于POST请求 响应Response 高级用法 一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requ ...
- RCU
RCU(read-copy-update)同步机制.R(Read):读者不需要获得任何锁就可访问RCU保护的临界区:C(Copy):写者在访问临界区时,写者“自己”将先拷贝一个临界区副本,然后对副本进 ...
- Windows/OS X下制作Mac安装U盘
Windows下制作: 方法一:(适用于OSX 10.9以前) 前期准备:一台windows电脑 UltraISO软件 Mac系统镜像dmg(这里使用Mac os x 10.8.4) 至少8GB的U盘 ...