P2704 [NOI2001]炮兵阵地

没学状压DP的看一下

此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵。

在做此题前,先做一下玉米田

玉米田题解

分析:

而m即一行的个数小于等于10,每个格子上只有防或不放两种情况

很自然就会想到状压DP

还有一点很重要:

要符合题目条件的 只有平原可以放炮兵。

所以还要匹配 炮兵放法与平原 的关系(一共要判断3种,PH,列列列,横横横)。

如下是DP思考过程:(和玉米田差不多)

我们需要考虑定义,我们可以定义dp[i][j][k]表示到第i行状态为j,且上一行状态为k时的最大方案数

然后我们要来考虑初始化,因为状态肯定由前两行推过来,所以我们需要单独处理第一二行的方案数

取最大的话就一定要和 原来的自己、前一个状态+增长 比较,取较大的那个

最后还有一个问题,数组dp[105][1024][1024]!!!!这空间超400MB啊!

所以还得优化空间。

滚动数组:因为当前状态只与前两行有关,所以只需保留有用的三行

dp[105][1024][1024] --> dp[3][1024][1024] 好很多了(已经不爆了,但我们要做到最优,这是OIer的信念)

预处理:实际上没有几种情况是可以满足横排的(m = 10时,70个不到),于是我们就可以把这些满足条件的保存下来。~~~

dp[3][1024][1024] --> dp[3][70][70]

代码:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=101;
int n,m;
int st[70],sum[70];
int cnt;
int dp[3][70][70];
int map[maxn];
int ans=0;
void init(int s,int tot,int i)
{if(i>=m){st[++cnt]=s;sum[cnt]=tot;//printf("st=%d sum=%d\n",st[cnt],sum[cnt]);return;}init(s,tot,i+1);init(s+(1<<i),tot+1,i+3);
}
void add()
{for(int i=1;i<=cnt;i++){//printf("st=%d map=%d ",st[i],map[0]);if(!(map[1]&st[i])){dp[1][i][0]=sum[i];//printf("%d\n",dp[1][i][0]);
        }//printf("sum=%d %d\n",sum[i],dp[0][i][0]);
    }for (int i=1;i<=cnt;i++){if(!(st[i]&map[2]))for (int j=1;j<=cnt;j++)if((!(st[j]&map[1]))&&(!(st[i]&st[j]))){dp[2][i][j]=sum[i]+sum[j];//printf("i=%d j=%d %d\n",st[i],st[j],dp[2][i][j]);
        }}
}
void come_dp()
{for (int i=3;i<=n;i++){for (int j=1;j<=cnt;j++){if(!(st[j]&map[i]))for (int k=1;k<=cnt;k++)if((!(st[k]&map[i-1]))&&(!(st[k]&st[j]))){for (int u=1;u<=cnt;u++)if((!(st[u]&map[i-2]))&&(!(st[u]&st[j]))&&(!(st[u]&st[k])))dp[i%3][j][k]=max(dp[i%3][j][k],dp[(i-1)%3][k][u]+sum[j]); }}}
}
void work()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){char x;cin>>x;map[i]<<=1;if(x=='H') map[i]+=1;}    }//printf("%d\n",map[1]);init(0,0,0);add();come_dp();for (int i=1;i<=cnt;i++)for (int j=1;j<=cnt;j++)ans=max(ans,dp[n%3][i][j]);printf("%d",ans);
}
int main()
{work();return 0;
}

逃qaq

转载于:https://www.cnblogs.com/mzyczly/p/10886670.html

C++ 洛谷 P2704 [NOI2001]炮兵阵地相关推荐

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

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

  2. 洛谷P2704 [NOI2001]炮兵阵地(状压dp)

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

  3. 洛谷 P2704 炮兵阵地 题解

    洛谷 P2704 炮兵阵地 题解 洛谷 P2704 题目 司令部的将军们打算在NNNMMM的网格地图上部署他们的炮兵部队.一个NNNMMM的地图由NNN行MMM列组成,地图的每一格可能是山地(用&qu ...

  4. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】

    正题 POJ链接:http://poj.org/problem?id=1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https: ...

  5. 洛谷p2704 炮兵阵地

    典型的状态压缩题,只是要定义dp[i][j][k], #include<bits/stdc++.h>using namespace std; int n,m,state[1<< ...

  6. [NOI2001]炮兵阵地

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

  7. 2022-5-20 吃月饼(something wrong), 数塔取数问题, 制铁棒, 子段统计, 炮兵阵地

    1. 吃月饼 有一块月饼,是正三角形的,又被分割成了许多块小正三角形的月饼,里面有若干块被吃掉了.现在想要在这块月饼中再找一个由小正三角形月饼的正三角形月饼,而且要求面积最大的. 样例解释: 大月饼的 ...

  8. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  9. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

最新文章

  1. js中JSON.stringify用于自定义的类
  2. Scikit-learn使用总结
  3. linux命令gen,Linux中msgen命令起什么作用呢?
  4. SAP Business One
  5. 从编码层面对比java和c#
  6. 2017.9.19 禁忌 失败总结
  7. sap期初导资产代码_SAP S/4固定资产导入期初科目设置
  8. 高通平台Android源码bootloader分析之sbl1(二)
  9. 各种浏览器网页背景颜色护眼设置
  10. Excel 2016添加复选框
  11. YARN ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
  12. 机电一体化综合实训考核装置
  13. ArcGIS 切片/瓦片的发布与加载
  14. ffmpeg裁剪视频画面
  15. php 函数索引 中文索引
  16. css3论坛,css3学习参考手册
  17. Win10+Ubuntu18.04双系统安装教程
  18. 学计算机当导演吗,学计算机8年 80岁老荣民当“导演”
  19. android 电路模拟器,仿真电路模拟器(专业版)
  20. SQLite 安装与使用

热门文章

  1. JenKins自动化构建部署流程参考
  2. 游戏安全报告(2017 - 2018全年)
  3. 【Node】新手入门 基于Express,Sequelize、IIS的MVC项目
  4. GitHub使用流程、初学者的使用方法
  5. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com
  6. 【学习笔记】HTML基础:使用html制作网页
  7. 使用RMAN创建复制数据库
  8. ZeroMQ接口函数之 :zmq_msg_get - 获取消息的性质
  9. 《硝烟中的Scrum和XP》学习手札
  10. Zookeeper集群详解