热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【状压dp】hdu4539郑厂长系列故事——排兵布阵

hdu4539郑厂长系列故事——排兵布阵http:acm.hdu.edu.cnshowproblem.php?pid4539问题描述:给你一个n行m列的0-1矩阵,0表示不

hdu 4539 郑厂长系列故事——排兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid=4539

问题描述:给你一个n行m列的0-1矩阵,0表示不能安置炮兵,1可以安置炮兵,要求炮兵的曼哈顿距离为2的位置不能有其他炮兵,问最多可安置炮兵的数目

思路: 状态压缩+位运算+动态规划

基本思路参考上一题

http://blog.csdn.net/u012717411/article/details/48898019

与上一题的区别在于曼哈顿距离为2,第i-1层对角线不能重复,第i-2层正对的不能重复,全部通过位运算解决,很好想,会前一题直到题就很简单,注意先把所有情况属枚举一遍确定范围,避免爆内存。


参考代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-9
#define pi acos(-1)
#define long long ll
#define M 10
#define N 110

using namespace std;

const int _max = 170 + 10;//最多可能状况不超169种,太大或MLE
const int mod = 1e8;

int x,n,m,row[N],top,st[_max];

int dp[N][_max][_max],cnt[_max];


bool judge(int x,int j){//自身地形合适
int y = st[j];
if(y&~x) return false;
return true;
}

void init(){//状态压缩
top=0;
for(int i = 0; i <(1< if(i&(i<<2)) continue;
st[++top] = i;
int t = i,res = 0;;
while(t){
if(t&1) res++;
t>>=1;
}
cnt[top] = res;
}
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
while(~scanf("%d%d",&n,&m)){
for(int i = 1; i <= n; ++ i){
row[i] = 0;
for(int j = 1; j <= m; ++ j){
scanf("%d",&x);
row[i]=(row[i]<<1)+x;
}
}
init();
memset(dp,0,sizeof(dp));
for(int i = 1; i <= top;++ i)
if(judge(row[1],i)) dp[1][i][1] = cnt[i];
//dp
for(int i = 2; i <= n; ++ i)
for(int j = 1; j <= top; ++ j){
if(!judge(row[i],j)) continue;//自己行地形合适
for(int k =1; k<= top; ++ k){//i-1行状态
if(st[j]&(st[k]<<1)) continue;
if(st[j]&(st[k]>>1)) continue;
for(int p = 1; p <= top; ++ p){//i-2行状态
if(st[j]&st[p]) continue;
if(st[k]&(st[p]<<1)) continue;
if(st[k]&(st[p]>>1)) continue;
dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][i==2?1:p]+cnt[j]);
}
}

}
int tar = -1;
for(int i = 1; i <= top; ++ i)
for(int j = 1;j <= top; ++ j)
if(tar printf("%d\n",tar);
}
return 0;
}
  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

推荐阅读
  • 本文介绍了一道来自《紫书》的编程题目——UVa11212 编辑书稿。该问题通过迭代加深搜索(IDA*)算法解决,旨在找到将给定排列转换为升序排列所需的最少步骤。文章提供了详细的解题思路和代码实现。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
  • http:acm.hdu.edu.cnshowproblem.php?pid1846好几天没出题了,今天终于水了一题巴什博弈题。总结:【一】巴什博弈对象:一堆石子(可延伸 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
  • 辗转相减法在求解最大等比值问题中的应用
    本文探讨了如何利用辗转相减法解决X星球大奖赛中奖金分配的数学问题,通过分析给定的数据点,计算出可能的最大等比值。 ... [详细]
  • 本文介绍了如何计算给定数组中所有非质数元素的总和,并提供了多种编程语言的实现示例。 ... [详细]
  • Java Servlet中获取客户端IP与MAC地址的方法
    本文介绍了一种在Java Servlet应用中获取客户端IP地址及MAC地址的技术实现方法,通过示例代码详细解析了获取过程中的关键步骤和技术点。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 在编写 PHP 类时,经常会遇到因类未正确实例化而导致的 'function non-object' 错误。本文将详细探讨 PHP 构造函数中的双下划线使用方法及其常见问题。 ... [详细]
  • 本文探讨了C++编程语言中声明与定义的区别,以及如何通过内部连接和外部连接来组织源文件,确保代码的正确链接与编译。文章详细解析了不同类型、变量、函数以及类的连接属性,并提供了实用的示例。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 单例模式是软件开发中常用的设计模式之一,用于确保一个类只有一个实例,并提供一个全局访问点。本文探讨了在单例模式实现中使用volatile关键字的重要性,特别是在懒汉模式下的应用。 ... [详细]
  • 本文介绍如何使用 Java 编程语言来判断一个给定的年份是否为闰年,并提供两种不同的实现方法。 ... [详细]
  • 本题探讨了一个生物链模型,其中每个生物 x 可以捕食 x+n 的生物,而 x+n 又捕食 x+2*n 的生物,形成一个循环的食物链。当 x 捕食 y 时,y 和 x+n 会被归类到同一个集合中,同样地,x 也会被归入 y+2*n 所在的集合。 ... [详细]
author-avatar
ya的sky
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有