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

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

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
Source
2013腾讯编程马拉松复赛第二场(3月30日)
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cstdlib>
  5 using namespace std;
  6
  7 int state[170],Num[170],len;
  8 int a[102];
  9 int befor[170][170],now[170][170];
 10 void Init()
 11 {
 12     int i,k=1<<10;
 13     int ans,x;
 14     len=0;
 15     for(i=0;i<k;i++)
 16     {
 17         if( (i&(i<<2)) || (i&(i>>2)) );
 18         else{
 19             state[len]=i;
 20             x=i;
 21             ans=0;
 22             while(x)
 23             {
 24                 ans++;
 25                 x=(x-1)&x;
 26             }
 27             Num[len++]=ans;
 28         }
 29     }
 30 }
 31 void make_Init(int n,int m)
 32 {
 33     int i,j,k=1<<m;
 34     int hxl;
 35     memset(befor,0,sizeof(befor));
 36     memset(now,0,sizeof(now));
 37     if(n==1)
 38     {
 39         hxl=0;
 40         for(i=0;i<len&&state[i]<k;i++)
 41         {
 42             if( (state[i]&a[1])==state[i] )
 43                 if(hxl<Num[i])
 44                 hxl=Num[i];
 45         }
 46         printf("%d\n",hxl);
 47         return;
 48     }
 49     for(i=0,hxl=0;i<len&&state[i]<k;i++)
 50     {
 51         if( (state[i]&a[2])!=state[i] ) continue;
 52         for(j=0,hxl=0;j<len&&state[j]<k;j++)
 53         {
 54             if( (state[j]&a[1])!=state[j] ) continue;
 55             if( ((state[i]<<1)&state[j]) || ((state[i]>>1)&state[j]) ) continue;
 56             befor[i][j]=Num[i]+Num[j];
 57             if(hxl<befor[i][j])
 58                 hxl=befor[i][j];
 59         }
 60     }
 61     if(n==2)
 62     {
 63         printf("%d\n",hxl);
 64     }
 65 }
 66 void solve(int n,int m)
 67 {
 68     int i,j,k=1<<m;
 69     int t,s,hxl;
 70     make_Init(n,m);
 71     if(n==1||n==2) return;
 72     for(i=3;i<=n;i++)
 73     {
 74         for(j=0;j<len&&state[j]<k;j++)
 75         {
 76             if((state[j]&a[i])==state[j])
 77             for(s=0;s<len&&state[s]<k;s++)
 78             {
 79                 if((state[s]&a[i-1])!=state[s]) continue;
 80                 if( ((state[j]<<1)&state[s]) || ((state[j]>>1)&state[s]) ) continue;
 81                 hxl=0;
 82                 for(t=0;t<len&&state[t]<k;t++)
 83                 {
 84                     if( (state[t]&a[i-2])!=state[t] ) continue;
 85                     if( (state[j]&state[t]) || ((state[s]<<1)&state[t]) || ((state[s]>>1)&state[t]) ) continue;
 86                     if(hxl<befor[s][t])
 87                         hxl=befor[s][t];
 88                 }
 89                 now[j][s]=hxl+Num[j];
 90             }
 91         }
 92         for(j=0;j<len&&state[j]<k;j++)
 93         for(s=0;s<len&&state[s]<k;s++)
 94         {
 95             befor[j][s]=now[j][s];
 96             now[j][s]=0;
 97         }
 98     }
 99     hxl=0;
100     for(j=0;j<len&&state[j]<k;j++)
101     for(s=0;s<len&&state[s]<k;s++)
102     if( hxl< befor[j][s] )
103         hxl=befor[j][s];
104     printf("%d\n",hxl);
105 }
106 int main()
107 {
108     int n,m;
109     int i,j,x;
110     Init();
111     while(scanf("%d%d",&n,&m)>0)
112     {
113         for(i=1;i<=n;i++)
114         {
115             a[i]=0;
116             for(j=1;j<=m;j++)
117             {
118                 scanf("%d",&x);
119                 a[i]=a[i]<<1;
120                 a[i]+=x;
121             }
122         }
123         solve(n,m);
124     }
125     return 0;
126 }

转载于:https://www.cnblogs.com/tom987690183/p/3444558.html

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. HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)

    郑厂长系列故事--排兵布阵 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. 排兵布阵问题java语言_hdu 4539 郑厂长系列故事——排兵布阵

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 修改类的命名空间引发的发布问题
  2. 想写总结,却变成了胡诌。。。
  3. Oracle 的一些语句
  4. Nginx负载均衡策略之轮询与加权轮询
  5. 嵌入式linux图形系统设计,轻量级嵌入式Linux图形系统设计与实现
  6. java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
  7. php配置email支持_使用PHPMailer实现PHP发邮件功能
  8. 使用Advanced Installer将.exe程序重新封装为.msi程序
  9. SWIG Python-C封装 char*相关问题(3)
  10. 【读书笔记】周志华《机器学习》第三版课后习题讨第一章-绪论
  11. 推荐系统系列教程之十二:Facebook是怎么为十亿人互相推荐好友的?
  12. 数字数据类型及其对应转移字符
  13. Atitit.故障排除系列---NoClassDefFoundError  NoClassDefFoundError ClassNotFoundException
  14. 【车牌识别】基于matlab投影模板匹配车牌识别【含Matlab源码 1359期】
  15. ESP-8266wifi模块获取网络实时时间
  16. 图像坐标系、相机坐标系和世界坐标系 相机的内、外参数矩阵
  17. Mark一下,以提醒自己
  18. Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建
  19. 小兮码 linux版本,【图片】单字利器:二笔顶功——小兮码【输入法吧】_百度贴吧...
  20. Gym101194F-Mr. Panda and Fantastic Beasts

热门文章

  1. linux:文件及目录管理
  2. python文件和目录访问File and Directory Access
  3. 力扣-62 不同路径
  4. Futter基础第17篇: 实现多行文本框、开关按钮、多选框、单选按钮、RadioListTile、Radio、表单
  5. Linux版本的tomcat安装包
  6. JSP — request 内置对象
  7. tensorflow构建CNN模型时的常用接口函数
  8. Django model 反向引用中的related_name
  9. Ubuntu 16.04 使用 Libcoap
  10. 使用yum update更新文件系统时不更新内核的方法