hdu 4539 郑厂长系列故事——排兵布阵
郑厂长系列故事——排兵布阵
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1338 Accepted Submission(s): 478
也不是副厂长
他根本就不是厂长
事实上
他是带兵打仗的团长
一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。
每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
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
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 郑厂长系列故事——排兵布阵相关推荐
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...
- hdu 4539 郑厂长系列故事——排兵布阵
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- HDU 4539 郑厂长系列故事――排兵布阵
/* 曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2| 题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一 ...
- 排兵布阵问题java语言_hdu 4539 郑厂长系列故事——排兵布阵
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Other ...
- 郑厂长系列故事——排兵布阵 状态压缩DP
郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- hdu-4539 郑厂长系列故事――排兵布阵(状态压缩)
类似于poj-1185 //曼哈顿距离 d = |x1 - x2| + |y1 - y2| //解决曼哈顿距离冲突 s[i]&(s[j] << 1)||s[i]&(s[j] ...
- HDU-4539 郑厂长系列故事——排兵布阵 状态压缩DP Or 最大团
题意:给定一个方格,然后告诉你一些规则,这些规则下方格中的有些位置是相冲突的.问在方格中最多能够放置多少个士兵. 分析:比赛时一开始就想着用状态压缩DP来搞,不过忘了相邻三行产生关系同样可以通过添加状 ...
- HDU4539-郑厂长系列故事——排兵布阵
郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上 他是带兵打仗的团长 一天,郑厂长带着他的军队来到了一个nm的平原准备布阵. 根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离 ...
最新文章
- 修改类的命名空间引发的发布问题
- 想写总结,却变成了胡诌。。。
- Oracle 的一些语句
- Nginx负载均衡策略之轮询与加权轮询
- 嵌入式linux图形系统设计,轻量级嵌入式Linux图形系统设计与实现
- java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
- php配置email支持_使用PHPMailer实现PHP发邮件功能
- 使用Advanced Installer将.exe程序重新封装为.msi程序
- SWIG Python-C封装 char*相关问题(3)
- 【读书笔记】周志华《机器学习》第三版课后习题讨第一章-绪论
- 推荐系统系列教程之十二:Facebook是怎么为十亿人互相推荐好友的?
- 数字数据类型及其对应转移字符
- Atitit.故障排除系列---NoClassDefFoundError NoClassDefFoundError ClassNotFoundException
- 【车牌识别】基于matlab投影模板匹配车牌识别【含Matlab源码 1359期】
- ESP-8266wifi模块获取网络实时时间
- 图像坐标系、相机坐标系和世界坐标系 相机的内、外参数矩阵
- Mark一下,以提醒自己
- Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建
- 小兮码 linux版本,【图片】单字利器:二笔顶功——小兮码【输入法吧】_百度贴吧...
- Gym101194F-Mr. Panda and Fantastic Beasts