poj1185 [NOI2001]炮兵阵地
http://poj.org/problem?id=1185
三维装压dp,压缩上一行状态与本行状态,枚举上两行状态转移
第一维可以滚掉,实际复杂度只枚举符合情况的情况,每行状态不会超过60并非$2^M$,(然而luogu还是跑T了),证明参见组合数
#include<cstdio>
#include<cstring>
#include<algorithm> const int maxnm = ;
const int maxn = ;
int n,m;
char a[maxn];
int cant[maxn*];
int map[][];
bool check(int x,int i) {
if(x&cant[i])return false;
if(x&(x<<)||x&(x<<))return false;
return true;
}
int dp[][<<maxn][<<maxn];
int num[<<maxn];
int main( ) {
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) {
scanf("%s",a) ;
for(int j=;j<m;++j)
if(a[j]=='H')
cant[i]|=(<<j);
}
int po=(<<m)-;
for(int k,i=;i<=po;++i) {
if(!check(i,))continue;
k=i;while(k) {
num[i]+=(k&);
k>>=;
}
}
int ans=-;
for(int i=;i<=n;++i) {
for(int j=;j<=po;++j) {
if(!check(j,i))continue;
for(int k=;k<=po;++k) {
if(!check(k,i-)||(k&j)) continue;
for(int p=;p<=po;++p) {
if(!check(p,i-)||(p&j)||(k&p)) continue;
dp[i&][k][j]=std::max(dp[i&][k][j],dp[(i&)^][p][k]+num[j]);
}
if(i==n)ans=std::max(ans,dp[n&][k][j]);
}
}
}
printf("%d\n",ans);
return ;
}
poj1185 [NOI2001]炮兵阵地的更多相关文章
- [Poj1185][Noi2001]炮兵阵地(状压dp)
		
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29476 Accepted: 11411 Descriptio ...
 - poj1185 [NOI2001炮兵阵地]
		
题目链接 状压DP 本来如果考虑所有情况应该开hh[n][2^10][2^10]表示i行在i-1的状态为j,i-2的状态为k的最大个数 但是由于每行中的人互相限制所以在m=10时只有60种情况 空间就 ...
 - [POJ1185][NOI2001]炮兵阵地 状压DP
		
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
 - POJ1185 [NOI2001] 炮兵阵地 (状压DP)
		
又是一道有合法性检测的状压题. dp[i][j][k]表示第i行状态为j,i-1行状态为k时前i行放置的最大数量. 注意22行统计二进制数中1的个数时的巧妙方法. 1 #include<cstd ...
 - [洛谷P2704] [NOI2001]炮兵阵地
		
洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...
 - C++ 洛谷 P2704 [NOI2001]炮兵阵地
		
P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...
 - P2704 [NOI2001]炮兵阵地 (状压DP)
		
题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...
 - 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
		
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
 - 【POJ1185】炮兵阵地 状压DP
		
感觉总是被一些SB错误所困扰... 差不多还是(模板题)注意数组空间的大小,和对于合法状态的判断. f[i][j][k]=max(f[i][k][j],f[i-1][l][k]+num[j]) (f[ ...
 
随机推荐
- windows phone UI吐槽---跑偏了就再也跑不回来了
			
首先wp的ui灵感来自瑞士的平面设计: 先上两张图,嗯,确实不错,简洁明了,强调的是信息本身,而不是冗余的界面元素,传达准确. 在现实生活中这种突出信息的设计语言也不时见到: 可以总结 ...
 - 设计模式之第0章-单例模式(Java实现)
			
设计模式之第0章-单例模式(Java实现) 当当当当~首先有请最简单的单例模式登场,先来个自我介绍吧 单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定 ...
 - Excel动画教程50例(三)
			
Excel动画教程50例(三) 31.Excel自定输入数据下拉列表 32.Excel正确输入身份证号码 33.Excel数据排序操作 34.Excel数据表格中如何将姓名信息按笔画排列 35.Exc ...
 - 【palindrome partitioning II】cpp
			
题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...
 - leetcode 【 Pascal's Triangle II  】python 实现
			
题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [ ...
 - Beamer模板
			
普通模板: \documentclass[UTF-8]{beamer} \usepackage{ctex} \usetheme{CambridgeUS} \begin{document} \secti ...
 - Spring框架的AOP
			
Spring学习笔记(四) 本文目录 1 AOP的介绍 2 Spring的AspectJ实现AOP(annotation) 3 Spring的AspectJ实现AOP (XML) Spring文档ht ...
 - jira从windows迁移到linux
			
说明:迁移的就是 jira安装路径/atlassian/jira/atlassian-jira/WEB-INF/classes/jira-application.properties文件中的jira_ ...
 - 【转】Twitter-Snowflake,64位自增ID算法详解
			
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...
 - JAVA 程序监控基础简述
			
最近在项目中自感程序木有问题,也没有什么错误日志出来.但就是有人反映服务慢,有时连不上的情况.为了解决这么妖的问题只能去详细的看看运行中的程序到底出了什么情况,这时如果有个比较好的监控工具可以监控运行 ...