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

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1954    Accepted Submission(s): 701

Problem Description
郑厂长不是正厂长
  也不是副厂长
  他根本就不是厂长
  事实上
  他是带兵打仗的团长

  一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
  根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
  现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。

Input
输入包含多组测试数据;
每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
Output
请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。
Sample Input
  
6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample Output
  
2
题解:
1. 曼哈顿距离:两点(x1,y1)(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2|;
2.假如一个点要安排士兵,我们要考虑的是曼哈顿距离为二的几个点是否会造成冲突,即若(x,y)安排人,则(x-2,y)(x-1,y+1),(x,y+2),(x+1,y+1),(x+2,y),(x+1,y-1),(x,y-2),(x-1,y-1)不能有人。然后就是状态方程了:dp[i][j][k] = Max(d[i][j][k],dp[i - 1][k][l] + sum[j]);
My Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 110
#define M 200using namespace std;int n,m,a[N];
int dp[N][M][M],cnt,num[M],sum[M];
///dp[i][j][k]  表示第i行的j状态 i-1行的k状态 的最优解bool ok(int x) {return (x&(x<<2))||(x&(x<<2));///第x-2个和x+2个位是否有人,// 有的话就不符合条件
}int getsum(int x) {  ///1的个数,即放多少个兵int sum=0;while(x) {if(x&1)sum++;x>>=1;}return sum;
}void init() {cnt=0;for(int i=0; i<(1<<m); i++) { ///预处理,压缩if(!ok(i)) {num[cnt]=i;sum[cnt++]=getsum(i);}}
}int main() {//freopen("in.txt","r",stdin);while(~scanf("%d%d",&n,&m)) {memset(a,0,sizeof a);for(int i=0; i<n; i++) {for(int j=0; j<m; j++) {int x;scanf("%d",&x);if(x)continue;///方便计算,把0存为1a[i]|=(1<<j);}}init();memset(dp,0,sizeof dp);for(int i=0; i<cnt; i++) { ///处理第一行if(a[0]&num[i])continue;dp[0][i][0]=sum[i];}///递推,要考虑三行的情况,for(int i=1; i<n; i++) { //第一行for(int j=0; j<cnt; j++) {if(a[i]&num[j])continue;   ///第一行与原来矩阵有冲突for(int k=0; k<cnt; k++) {   ///第二行if(a[i-1]&num[k])continue;if(((num[k]<<1)&num[j])||((num[k]>>1)&num[j]))continue; //i-1行int Max=-1;for(int l=0; l<cnt; l++) {       ///第三行if(num[j]&num[l])continue;if(((num[l]<<1)&num[k])||((num[l]>>1)&num[k]))continue;Max=max(Max,dp[i-1][k][l]);}dp[i][j][k]=Max+sum[j];}}}int Max=-1;for(int i=0; i<cnt; i++)for(int j=0; j<cnt; j++)Max=max(Max,dp[n-1][i][j]);printf("%d\n",Max);}return 0;
}

HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)相关推荐

  1. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

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

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  3. 郑厂长系列故事——排兵布阵 状态压缩DP

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  4. HDU 4539 郑厂长系列故事――排兵布阵

    /* 曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2| 题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一 ...

  5. HDU-4539 郑厂长系列故事——排兵布阵 状态压缩DP Or 最大团

    题意:给定一个方格,然后告诉你一些规则,这些规则下方格中的有些位置是相冲突的.问在方格中最多能够放置多少个士兵. 分析:比赛时一开始就想着用状态压缩DP来搞,不过忘了相邻三行产生关系同样可以通过添加状 ...

  6. 排兵布阵问题java语言_hdu 4539 郑厂长系列故事——排兵布阵

    郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  7. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地

    题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Other ...

  8. hdu-4539 郑厂长系列故事――排兵布阵(状态压缩)

    类似于poj-1185 //曼哈顿距离 d = |x1 - x2| + |y1 - y2| //解决曼哈顿距离冲突 s[i]&(s[j] << 1)||s[i]&(s[j] ...

  9. HDU4539-郑厂长系列故事——排兵布阵

    郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上 他是带兵打仗的团长 一天,郑厂长带着他的军队来到了一个nm的平原准备布阵. 根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离 ...

最新文章

  1. mysql外键教程_MySQL外键使用详解
  2. c语言精炼pdf,发计算机二级C语言多年精炼笔试试卷.pdf
  3. 【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )
  4. 前端学习(2786):完成推荐商品结构之头部标签栏
  5. Hadoop中mapreduce作业日志是如何生成的
  6. zabbix 搭建 mysql 连接报错
  7. mysql base64的编码与解码
  8. 《线性代数》(同济版)——教科书中的耻辱柱
  9. Android resource compilation failed
  10. 常见的markdown语法总结(不断更新中......)
  11. Orleans 2.0 官方文档 —— 3.1 核心概念 - 什么是grain
  12. 【手绘漫画】图解LeetCode之旋转链表(LeetCode 61题)
  13. android平板投屏,Mac、ipad投屏安卓平板
  14. Mellanox网卡FW刷新步骤
  15. yocs_velocity_smoother速度平滑包的动态参数设置
  16. 十一长假宅到底,Wi-Fi可能伤不起
  17. 理解图卷积网络的节点分类
  18. 1272: 下载记忆  小明比较怀旧,想网上下载儿时武侠片,他用自己的血汗钱办理充值会员。会员是按月充的,每月的费用为15元。问小明充值多少元,才能将所有的武侠剧下载完。
  19. Vue使用iview中menu菜单组件的大坑!
  20. 工业智能网关是工厂设备数据采集解决方案工具

热门文章

  1. 千万别成为受害者:手机防盗指南
  2. ASP.NET 2.0使用FileUpload控件上传文件示例
  3. 期货市场技术分析03_主要反转形态
  4. VUE+Canvas实现输入文字生成对应的字体图片小功能
  5. Ubuntu22.04更新以后黑屏
  6. stream流详解(JDK1.8的特性)
  7. ceiling 和 floor 函数
  8. 推荐几款比较好的图表组件
  9. 时海君:apache第一讲-commons cli
  10. currentstyle 织梦_织梦channel标签currentstyle样式无效不起作用