洛谷P2704:https://www.luogu.org/problemnew/show/P2704

思路

这道题一开始以为是什么基于状压的高端算法

没想到只是一道加了一行状态判断的状压DP而已

与普通状压并无多大区别

详细见代码

代码

#include<iostream>
using namespace std;
#define maxn 1010
int f[][maxn][maxn],num[maxn],st[maxn],map[];
int n,m,ans,state;
int get(int x)//计算每行1的个数
{
int t=;
while(x>)
{
++t;
x-=x&(-x);//减去lowbit 就是最后一个1
}
return t;
}
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
char x;
cin>>x;
if(x=='H')//如果是山地就是1
map[i]=(map[i]<<)+;
if(x=='P')//如果是平原就是0
map[i]=(map[i]<<);
}
for(int i=;i<=(<<m)-;i++)//枚举所有状态查找可用状态
if(!(i&(i<<))&&!(i&(i<<))&&!(i&(i>>))&&!(i&(i>>)))//判断此行可用
{
st[++state]=i;//记录状态
num[state]=get(i);//计算1的个数
if(!(i&map[])) f[][][state]=num[state];//初始化第一行 如果不与地形冲突
}
for(int i=;i<=state;i++)//初始化第二行
for(int j=;j<=state;j++)
if(!(st[i]&st[j])&&!(st[j]&map[])) //如果第二行和第一行和地形都不冲突
f[][i][j]=max(f[][i][j],f[][][i]+num[j]);
for(int i=;i<=n;i++)//从第三行开始枚举
for(int j=;j<=state;j++)//枚举此行状态
if(!(map[i]&st[j]))//判断是否和地形冲突
{
for(int k=;k<=state;k++)//枚举上一行状态
if(!(st[j]&st[k]))//上一行不与此行冲突
{
for(int t=;t<=state;t++)//枚举上上行状态
if(!(st[t]&st[k])&&!(st[t]&st[j]))//上上行不与上一行和此行冲突
f[i][k][j]=max(f[i][k][j],f[i-][t][k]+num[j]);//记录
}
}
for(int i=;i<=state;i++)//枚举最后两行的所有状态
for(int j=;j<=state;j++)
ans=max(ans,f[n][i][j]);//取最大值
cout<<ans;
}

【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)的更多相关文章

  1. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  2. P2704 [NOI2001]炮兵阵地 (状压DP)

    题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...

  3. C++ 洛谷 P2704 [NOI2001]炮兵阵地

    P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...

  4. 洛谷P2704 [NOI2001]炮兵阵地题解

    题目描述 司令部的将军们打算在\(N * M\)的网格地图上部署他们的炮兵部队.一个\(N * M\)的地图由N行M列组成,地图的每一格可能是山地(用\("H"\) 表示),也可能 ...

  5. [洛谷P2704] [NOI2001]炮兵阵地

    洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...

  6. 洛谷 P2704 [NOI2001]炮兵阵地 (状态压缩DP+优化)

    题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...

  7. [NOI2001]炮兵阵地 状压DP

    题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...

  8. [POJ1185][NOI2001]炮兵阵地 状压DP

    题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...

  9. 洛谷 P2704 [NOI2001]炮兵阵地

    题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...

随机推荐

  1. zookeeper【4】master选举

    考虑7*24小时向外提供服务的系统,不能有单点故障,于是我们使用集群,采用的是Master+Slave.集群中有一台主机和多台备机,由主机向外提 供服务,备机监听主机状态,一旦主机宕机,备机必需迅速接 ...

  2. Nginx 504错误总结

    Nginx 504错误(Gateway time-out  网关超时)的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的f ...

  3. JavaEE之动态页面技术(JSP/EL/JSTL)

    动态页面技术(JSP/EL/JSTL) JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%= ...

  4. Python-并发编程(线程)

    之前我们说了并发编程中的进程问题,几天我们来聊聊并发编程中的线程问题. 一.背景知识 1.进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能 ...

  5. 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1

    ************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...

  6. MySQL数据库学习笔记<一>

    MySQL基本概念以及简单操作   一.MySQL   MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系 ...

  7. 使用JS完成首页轮播图效果

    获取document.getElementById("id名称"); 事件onload 定时操作setInterval("changeImg()",3000); ...

  8. 项目经验:GIS<MapWinGIS>建模第一天

    随便记录下项目的进展情况: GIS平台系统,实现整个供水系统的协调与统一.系统以管网为基础依据,建立可实现供水管网规划设计.输配管理.图档管理.抢修辅助决策及综合查询.统计等功能. 本文档的预期读者是 ...

  9. unity3d代码优化标准

    转载自:https://blog.csdn.net/m0_37283423/article/details/84378384 代码优化 ● 尽可能使用for来代替foreach:每次foreach会产 ...

  10. Oracle基础之count(1)和count(*)的区别

    在数据库中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数.很多人其实对这三者之间是区分不清的.本文会阐述这三者的作用,关系以及背后的原理. 我在网上看到一些所谓的优 ...