POJ - 1185 炮兵阵地 状压dp

【IoT】压力式电子脉搏器设计 智能硬件 阅读详情

炮兵阵地
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 26819 Accepted: 10362

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


状态压缩的很巧妙,把每个点上放和不放看为1和0 ,这样就可以把一行上放与不放的状态视为一个二进制数,同样也对应了一个十进制数,例如只有第一个点放1000   对应了8

又因为炮的爆炸范围是二,这一行的状态只和前两行有关,并且判定这两行的状态能不能同时存在,把这两个数&一下,因为对应位不能同时为一,也就是不能都放炮兵

先把所有能存在的状态找出来,也就是这个数的位上不能存在相邻或两个间隔只有一的两个1

dp【i】【j】【k】代表第i行是j状态,第i-1行是k状态时最多能放的炮兵数量,

然后对于每一行求解,都枚举包括此行在内在加上前两行所有的状态,找到可以同时存在的那个情况,dp【i】【j】【k】=max(dp【i】【j】【k】,dp【i-1】【k】【z】)

保存两个状态是因为确定当前状态是否可行必须要知道前两个状态,那么如何做到递推方程里只有这三个状态呢,那就只能是dp数组里保存两个状态,当前状态和前一个状态

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define legal(a,b) a&b 
typedef long long ll;
using namespace std;
char mapp[150][20];
int dp[150][70][70],n,m,base[150],state[70],sn[70];
int get(int x)
{
	int s=0;
	while(x)
	{
		x-=x&-x;
		s++;
	}
	return s;
}
int main()
{
	int ans,maxx,k,z,i,j,num;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
	{
		scanf("%s",mapp[i]);
		for(j=0;j<m;j++)
		{
			if(mapp[i][j]=='H')
			base[i]+=1<<j;
		}	
	}
	for(num=0,i=0;i<(1<<m);i++)
	{
		if(legal(i,i<<1)||legal(i,i<<2))//||legal(i,i>>1)||legal(i,i>>2)
		continue;
		state[num]=i;
		sn[num++]=get(i);
	}
//	printf("%d\n",num);
	for(i=0;i<num;i++)
	{
		if(legal(state[i],base[0]))
		continue;
		dp[0][i][0]=sn[i];
	}


	for(i=0;i<num;i++)
	{
		for(j=0;j<num;j++)
		{
			if(legal(state[j],base[1])||legal(state[i],base[0])||legal(state[i],state[j]))
			continue;
			dp[1][j][i]=max(dp[1][j][i],dp[0][i][0]+sn[j]);
		}
	}
	
	for(i=2;i<n;i++)
	{
		for(j=0;j<num;j++)
		{
			for(k=0;k<num;k++)
			{
				for(z=0;z<num;z++)
				{
					if(legal(state[j],base[i])||legal(state[k],base[i-1])||legal(state[z],base[i-2]))
					continue;
					if(legal(state[j],state[k])||legal(state[j],state[z])||legal(state[k],state[z]))
					continue;
					dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][z]+sn[j]);
				}
			}
		}
	}
	ans=0;
	for(i=0;i<num;i++)
	{
		for(j=0;j<num;j++)
		{
			ans=max(ans,dp[n-1][i][j]);
		}
	}
	printf("%d\n",ans);
	return 0;
 }


RAG的“诊断艺术”:从测试集结果倒追根源,精准优化检索、排序与生成 当RAG应用给出一个糟糕的答案时,开发者的第一反应可能是:“我的Prompt写得不够好?”这种基于“感觉”的猜测往往是低效的。通过构建一个包含黄金上下文信息的测试集,我们可以像一位经验丰富的医生一样,对RAG系统的各个“器官”进行独立的“健康检查”。一个用于RAG诊断的测试集,除了问题和答案,还需要包含中间环节的“黄金标准”。如果你的RAG流程包含Re-ranker,那么在评估完初期的召回后,需要单独评估Re-ranker的效果。RAG的优化是一个持续的过程,应该形成一个闭环。的文档块尽可能多地召回。 阅读详情

相关推荐

DDR的Controller、Channel、Chip、Rank、Bank、Row、Column、Sided、Dimm

DDR的Controller、Channel、Chip、Bank、Rank、Row、Column、Sided、Dimm

张飞online博客 2万+

POJ1185炮兵阵地(状压dp)

POJ1185炮兵阵地(状压dp) 学了两周的状压dp,终于把这道题a了… 参考的这篇大佬的博客学习的状压 点这里 题意: 给一个N X M的地图,其中P代表平原能放一个炮兵,H代表一个山不能放炮兵,每个炮兵可以打到上下左右相距为2的距离。问在炮兵互不伤害的情况下地图上最多能放多少个炮兵。(N &lt;= 100,M &lt;= 10) 思路: 看到数据范围和显然这是一道状压dp的题目,首先我们把...

qq_42911793的博客 264

Unity3D Lua与C#的相互调用与性能剖析详解

在游戏开发中,经常会遇到Lua与C#之间的相互调用的情况。本文将详细介绍Unity3D中Lua与C#的相互调用的方式,并对其性能进行剖析。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!一、Lua与C#的相互调用方式Lua调用C#在Unity3D中,可以通过Lua调用C#的方式来实现Lua与C#的相互调用。具体步骤如下:(1)首先需要在Unity3D项目中导入Lua的相关库,例如tolua或者xlua。

weixin_49669470的博客 1215

POJ 1185 炮兵阵地(状压dp)

状压dp 状态压缩+dp。把某一个需要用0和1来表示的图看成二进制,然后转成10进制,从而把本来需要一个数组来表示的转态转换为一个数来表示。并且通过位运算优化计算速度,和dp结合起来就是状压dp。我自己的理解,应该是这样子。之前看过一篇数独的题解,那时只知道代码里全是二进制来存储情况,现在想想那好像就是状压dp了吧。 POJ 1185 炮兵阵地 司令部的将军们打算在NM的网格地图上部署他们的炮兵部...

H4ppyD0g的博客 297

512分辨率万能遮罩模型实战指南:从下载到高精度应用

本文提供了512分辨率万能遮罩模型的完整实战指南。该模型经过超过540万次迭代,专门优化了对头发、手、眼睛等复杂区域的识别。文章详细介绍了从可靠渠道下载、环境部署、使用DF_ICE工具批量应用遮罩,到利用XSeg Editor进行高精度精修的全流程,旨在帮助用户显著提升AI换脸合成视频的质量与效率。

y2z3a4b5c的博客 1165

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

由于Milvus官方文档只提及如何使用docker安装部署Milvus,关于源码安装方式篇幅较少,因此,我整理撰写了如何通过源码编译方式成功安装Milvus,详见此篇。之所以选择这种复杂的安装方式,可以调试源码进而熟悉Milvus如何搭建整个框架支持AI上层应用功能。根据上篇步骤部署虽然可以成功,然而,我却不能成功启动Milvus服务,这个问题困扰了一两天,现在终于得以解决并能成功调试Milvus源码。接下来,分为三个部分介绍如何启动和成功调试。

qq_43893755的博客 3368

[poj1185]炮兵阵地_状压dp

炮兵阵地 poj-1185     题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数。     注释:n<=100,m<=10。然后只能在平原的地方建立炮兵。       想法:第2到状压dp,++。这题显然是很经典的。设状态dp[i][j][k]表示第i行的状态为j,i-1行的状态为k的最多炮兵数。在转移时,枚举所有的合法炮兵排列(此处的合法数目是根据一行全为平原的时...

weixin_30438813的博客 83

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

POJ 1185 炮兵阵地 (状压DP)

www.cnblogs.com/shaokele/ POJ 1185 炮兵阵地 (状压DP)   Time Limit: 2 Sec   Memory Limit: 64 MB Description   司令部的将军们打算在NM的网格地图上部署他们的炮兵部队。一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可...

weixin_30414635的博客 116

lammps教程:实例讲解npt、nvt系综的选择

对于lammps新手来说,系综的选择令人困惑,到底是应该用nvt系综还是npt系综? 我在初学lammps时就被这个问题困扰了很久。如果去问别人,可能会告诉你一个答案:根据模拟需要确定。 其实和没说一样。 到底如何确定系综,确实不是一句两句能够说清楚的,不同的体系、不同的模拟目的要选择不同的系综。 前几天遇到的一个合金的模拟案例,比较有代表性,分享出来供大家参考。 建模方法和之前介绍过的高熵合金建模方法类似,先建立单晶模型,然后使用替换原子的命令获得合金结构。 建模完成后,按照常规,先上nvt系综进行驰豫

lammps_jiayou的博客 9767

SwinTransformer改进(5):与CBAM结合的视觉模型

这个模型的核心思想是将Swin Transformer的强大特征提取能力与CBAM的注意力机制相结合,以提升模型对重要特征的关注度。​​CBAM模块​​:包含通道注意力和空间注意力两个子模块​​Swin Transformer主干网络​​:作为基础特征提取器​​集成结构​​:在Swin Transformer的不同阶段插入CBAM模块使用移动窗口(Moving Window)机制减少计算量层次化设计,特征图逐渐缩小,通道数逐渐增加在不同阶段使用Patch Merging进行下采样。

2401_82355416的博客 688

POJ-1185炮兵阵地(状压dp)

题意:POJ1185 N∗MN*MN∗M的图,HHH表示山地,PPP表示平原,山地不能布置炮兵,平原可以布置炮兵,111个炮兵影响的范围是上下左右各两个区域,问放最多能放几个炮兵。 分析: 先将读入的图转化为二进制数pic[i]pic[i]pic[i](这里111表示山地,000表示平原),因为同一行状态最多有102410241024个,而根据题目限制可行状态其实只有707070个左右,所以预处理...

Chase的博客 209

从权限对象到业务角色:把 SAP Authorization Object 讲清楚,并用 ABAP 写对一次 AUTHORITY-CHECK

摘要:SAP权限管理的核心在于Authorization Object(授权对象),它通过组合最多10个授权字段来精确控制用户访问权限。关键要点包括:1) 授权对象与ACTVT字段(如01创建/02修改/03显示)的配合使用;2) ABAP中AUTHORITY-CHECK语句的四种常见返回码(0通过/4字段不匹配/12无权限/40无效用户);3) 系统自动执行的S_TCODE事务码检查;4) 自定义授权对象时应遵循"最少且足够"原则,优先复用标准对象。在RAP和OData场景中,权限检查

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 266

【POJ 1185】炮兵阵地(状压DP)

【POJ 1185】炮兵阵地(状压DP) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23107   Accepted: 8957 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格

ACMer' 1877

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

POJ 1185 炮兵阵地 状压dp

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

weixin_44273380的博客 226

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

POJ1185 炮兵阵地 —— 状压DP

题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit:2000MS Memory Limit:65536K Total Submissions:30608 Accepted:11828 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮...

alince20008的博客 154

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ - 1185 炮兵阵地(状压DP)

题目: 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队。一个NM的地图由N行M列组成,地图的每一格可能是山地(用&quot;H&quot; 表示),也可能是平原(用&quot;P&quot;表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左...

JingluoZZZ 311

poj 1185 炮兵阵地 状压dp

题目链接 题意 在\(N\times M\)的\(0,1\)格子上放东西,只有标记为\(1\)的格子可以放东西,且每一格的向上两个,向下两个,向左两个,向右两个格子均不能放东西。问整张图上最多能放多少东西。 思路 参考:accry. 因为每一行的状态与上两行有关,所以用\(dp[i][j][k]\)表示放到第\(i\)行,当前行的状态为\(j\),上一行的状态为\(k\)时的情况总数。 ...

ahu12345678的博客 175

poj 1185 炮兵阵地 【状压dp】

题目链接:http://poj.org/problem?id=1185 题目大意:一个方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示\,让放最多的大炮,大炮与大炮间不会互相攻击。 /* dp[i][j][k] 表示第i行状态为k,第i-1状态为j时的最大炮兵个数。  递归方程:dp[i][l][j]=max(dp[i][l][j],dp[i-1][k][l]+num[j])...

几许情愁的博客 225

[状压dp]POJ1185 炮兵阵地

中文题 题意不再赘述 对于中间这个“P” 根据dp的无后效性 我们只需考虑前面的 就变成了 只需考虑: 也就是状压前两行 具体与HDOJ的4539类似: 看HDOJ 4539 仅仅是共存状态的判断不同 1 //#include <bits/stdc++.h> 2 #include <cstdio> 3 #in...

aicheng4794的博客 139

POJ 1185——炮兵阵地【状压DP & 空间预处理优化】

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

NIRVANA REBIRTH 380

炮兵阵地 POJ - 1185(状压DP)

G - 炮兵阵地 题目链接:POJ - 1185POJ-3254的升级版;题意:N*M的地图标有H,G, H不能建炮兵阵地, P可以,炮兵阵地之间至少要间距两个格子(POJ-3254是不能相邻);若用1表示有炮兵阵地, 0表示无, 则1001...

Sirius_han的博客 442

状压dp经典题 POJ 1185///洛谷P2704 [NOI2001]炮兵阵地

状压dp经典题 [NOI2001]炮兵阵地 题目链接: POJ 1185 or 洛谷P2704 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=70; //经过预处理后最多可达到的状态数,这个数可以通过打表计算 using n...

dominicwilson的博客 186

poj1185炮兵阵地【状压dp】

poj1185炮兵阵地 题意: n*m的地图(n<=100, m<=10),有H山地、P平原两种地形,平原上可以部署炮兵。炮兵伤害范围为横竖范围2格并且无视地形,问在保证互不伤害的情况下最多部署几个炮兵。老套路按行转移,炮兵伤害2格,当前行会受到前两行的影响,因此要用到三维,但三维时间空间都炸了。 考虑到炮兵互不伤害,2102^{10}中有很多非法状态,没必要开这么大,预处理出一行的

lh的博客 457

POJ 1185 炮兵阵地 【状压DP】

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

weixin_30578677的博客 79

POJ-1185_炮兵阵地(经典状压dp)

→This is the question [Submit] 炮兵阵地 Time Limit:2000MS Memory Limit:65536K Total Submissions:35879 Accepted:13726 Description 司令部的将军们打算在N*M的网格地图...

From now on...的Blogs 273
上一篇: CodeForces-540C//Codeforces Round #301 (Div. 2)C BFS
下一篇: 数学小知识
jerans
博客等级 码龄10年 54粉丝 255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值