(状态压缩) 炮兵阵地(P1185)

2023-05-16

题意:在一个二维方格中,安置大炮。有平原有高山,只有平原可以安。

           大炮的射程是四个方向,距离为2格。

          求:最多能安多少个大炮。


方法:对于每一行的一种状态用一个整数表示,第一个位对应一格,1代表放,0代表不放。

           这样当前行的状态是否可行与当前行的地开有关,与相互之间的大炮安置位置有关,

          与前两行的大炮位置有关,其直接计算的时间 复杂度为O(N*2^M*2^M&2^M),

          最高能达到100000000000,这么多。但每一行中符合一定条件(当前行大炮之间的矛盾)

          的状态较少,最多为60个。这样就直接把复杂度降到了21600000左右。

          dp[i][j][k]中代表在第i行中当前行的状态为k,上一行的状态为j时的最大大炮数。

          s[i]代表满足要求的第i个状态(用于加速)。

          map[i] 记录第i行的地形状态。

 

网址:http://poj.org/problem?id=1185


#include<iostream>

using namespace std;  

int n,m;
int s[61];
int  nstate;
int dp[101][61][61];
int  map[101];

bool isok(int x)
{
	if (x<<1&x)	return false;
	if (x<<2&x) return false;
	return true;
}

int sum(int x)
{
	int num=0;
	while (x)
	{
		num++;
		x-=x&-x;
	}
	return num;
}

int main()
{
	freopen("in.txt","r",stdin);
	int i,j,k,h;
	cin>>n>>m;
	char str[11];
	for (i=0;i<n;i++)
	{
		cin>>str;
		for (j=0;j<m;j++)  //记录地形状态
		{
			map[i]<<=1;
			if (str[j]=='H')
				map[i]|=1;
		}
	}
	
	for (i=0;i< 1<<m;i++)   //找到符合当前行大炮位置满足要求的状态
		if (isok(i))
			s[nstate++]=i;
	int ans=0;
	for (i=0;i<nstate;i++)
	{
		dp[0][0][i]=sum(s[i]);  //记录每个符合要求的当前 行的大炮数。
		if (!(s[i]&map[0])) 
			ans=max(dp[0][0][i],ans);  
	}
	if (n<2)  
	{
		cout<<ans<<endl;
		return 0;
	}
	for (i=0;i<nstate;i++)  if (!(s[i] & map[0]))   //初始化第二行
		for (j=0;j<nstate;j++)  if (!(s[j]&map[1]) && !(s[i]&s[j]))
			dp[1][i][j]=dp[0][0][i]+dp[0][0][j],ans=max(ans,dp[1][i][j]);		
	for (i=2;i<n;i++)
		for (j=0;j<nstate;j++) if (!(s[j]&map[i-2]))   //与地形符合
			for (k=0;k<nstate;k++) if (!(s[k]&map[i-1]) && !(s[j]&s[k]))  //与地形和前一行符合
				for (h=0;h<nstate;h++) if (!(s[h]&map[i]) && !(s[h]&s[j]) && !(s[h]&s[k]))   //与地形和前两行符合
					dp[i][k][h]=max(dp[i][k][h],dp[i-1][j][k]+dp[0][0][h]),ans=max(ans,dp[i][k][h]);
	
	cout<<ans<<endl;
	
	return 0;
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(状态压缩) 炮兵阵地(P1185) 的相关文章

随机推荐

  • windows远程登录 ubuntu Linux 系统及互连共享桌面

    预备工作 开启防火墙端口 sudo ufw allow 3389 安装ssh sudo apt get install openssh server 一 windows直连Ubuntu16 04共享桌面 1 打开终端 xff0c 安装xrd
  • windows soci库编译

    SOCI SOCI是一个C 43 43 库 xff0c 用来访问数据库 githu链接点击这里 这个库需要通过源码编译 xff0c 有对数据库client的依赖 xff0c 所以本地需要安装了的需要的数据库client SOCI支持的数据库
  • 使用冒泡法对十个整数进行排序

    输入10个整数 xff0c 将它们从小到大排序后输出 xff0c 使用冒泡排序算法 span class token macro property span class token directive hash span span clas
  • c++ new运算符是如何调用构造函数的

    文章目录 内存申请和对象构造placement new答案很简单参考链接 内存申请和对象构造 本文内容简短 xff0c 只为记录下一次思考过程 xff0c 事情起源于一句话 xff0c new操作符会调用operator new分配内存再调
  • VS2015报错LNK2001 "public: virtual struct QMetaObject const...

    在VS2015中C 43 43 项目会出现报错 xff0c 我的错误是以下三个外部命令 1 LNK2001 34 public virtual struct QMetaObject const cdecl UTMUI metaObject
  • VS2015报错 无法打开python37_d.lib文件

    这个问题百度了很多次 xff0c 为了解决走了完了 xff0c 也让我更了解VS的Release和Debug VS的2015的Debug需要在属性 链接器 输入 附加依赖器里面写的是python37 d lib 而Relase里写的是pyt
  • ASM1053E ASM1153E对比

    转自https www chiphell com thread 1586025 1 1 html 市面上的SATA转USB3 0解决方案五花八门 xff0c 作为消费者有时候被厂家的宣传搞得晕头转向 xff0c 而一个核心主控好坏直接决定产
  • 普通门禁卡及各类复制卡相关知识

    转自 xff1a https nfctool cn 42 本文带你了解M1卡的数据结构 xff0c 为以后的破解提供理论基础 同时带你了解各种IC卡 xff0c 让你对破解和复制有更清晰的目标 请注意 xff0c ID卡没有密码 xff0c
  • NVIDIA Jetson TX2 更新软件源

    1 xff0c 确定系统版本 ubuntu14 04是trusty xff0c ubuntu16 04是xenial 2 xff0c 先备份原文件sources list xff0c 防止误操作后无法恢复 将原来的内容使用 符号全部注释掉
  • 查看上次安装 Archlinux 的日期

    0x00 前言 刚刚接触到 Archlinux 的时候 xff0c 大家都说这个系统容易挂 xff0c 然而用到现在我也没重装过几回 如何查看上次安装 Archlinux 是什么时候呢 xff1f 下面给出几种方法 0x01 方法 查看文件
  • Ubuntu中文字符显示问题

    文件夹名字无法显示中文 我也不知道到底怎么解决的 xff0c 大概最后是执行了以下 xff0c 就莫名其妙好了 sudo apt install ttf mscorefonts installer y sudo dpkg configure
  • 用户不在sudoers文件中的解决方法&amp;…

    在使用Linux系统过程中 xff0c 通常情况下 xff0c 我们都会使用普通用户进行日常操作 xff0c 而root用户只有在权限分配及系统设置时才会使用 xff0c 而root用户 的密码也不可能公开 普通用户执行到系统程序时 xff
  • Proxmox VE与常见的虚拟化平台比较

    1 Proxmox VE的简要介绍 Proxmox VE的简要介绍 根据Proxmox VE的官网介绍 xff0c Proxmox Virtual Environment xff08 简称Prxomox VE或PVE xff09 由位于奥地
  • Proxmox VE与常见的私有云方案比较(中)

    2 2 SmartX私有云解决方案 SmartX这家公司挺有意思的 xff0c SmartX 是番文的叫法 xff0c 这家公司好像不愿意或者是有意不让人知道他的中文名称叫啥 xff0c 不知道这是不是传说中的卑于内而媚于外 你翻遍了Sma
  • Proxmox VE 7.0的高级安装及系统盘分区-ZFS(中)

    2 2 ZFS文件系统安装方式 从Proxmox VE 3 4开始 xff0c Proxmox VE增加了ZFS文件系统作为可选的文件系统和根文件系统 Proxmox VE官方提供的ISO镜像已经集成了ZFS所需的软件包 xff0c 用户无
  • Proxmox VE逻辑卷管理LVM详解(1-4)

    Proxmox VE基于Debian Linux操作系统 xff0c 也就是说Linux操作系统的逻辑卷管理LVM在Proxmox VE也是适用的 当我们在使用Proxmox VE的时候 xff0c 如果发现某个分区的容量不够用了 xff0
  • KVM虚拟化解决方案系列之KVM部署篇(4-4)

    5 2 Ubuntu上安装虚拟机 Ubuntu上安装虚拟机的过程与CentOS上类似 xff0c 这里我也简单讲一下 第一步 xff0c 创建虚机镜像文件 使用命令 qemu img 创建一个空白的虚拟机镜像 xff0c 格式为qcow2
  • KVM虚拟化解决方案系列之KVM管理工具-绪论篇

    我们在 KVM虚拟化解决方案系列之KVM架构篇 有讲到两个重要的内容 xff0c 一个内容是 要实现一个可运行 可运维的KVM虚拟化解决方案 xff0c 需要解决两个问题 xff0c 第一个是虚拟化技术实现问题 xff0c 第二个是集群虚拟
  • KVM虚拟化解决方案系列之KVM管理工具-libvirt介绍篇

    KVM作为后起之秀 xff0c 在公有云Hytervisor市场中占主宰地位 xff0c 如一大批基于OpenStack二次开发的云厂商 而老牌的商业VMware则在私有云Hytervisor市场中占主宰地位 xff0c 仍然是各大中小企业
  • (状态压缩) 炮兵阵地(P1185)

    题意 xff1a 在一个二维方格中 xff0c 安置大炮 有平原有高山 xff0c 只有平原可以安 大炮的射程是四个方向 xff0c 距离为2格 求 xff1a 最多能安多少个大炮 方法 xff1a 对于每一行的一种状态用一个整数表示 xf