hdu 4539 郑厂长系列故事——排兵布阵
2013-11-26 23:08
281 查看
郑厂长系列故事——排兵布阵
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1338 Accepted Submission(s): 478
[align=left]Problem Description[/align]
郑厂长不是正厂长
也不是副厂长
他根本就不是厂长
事实上
他是带兵打仗的团长
一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵。
根据以往的战斗经验,每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。
现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。
[align=left]Input[/align]
输入包含多组测试数据;
每组数据的第一行包含2个整数n和m (n <= 100, m <= 10 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的矩形阵地,其中1表示该位置可以安排士兵,0表示该地形不允许安排士兵。
[align=left]Output[/align]
请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
2
[align=left]Source[/align]
2013腾讯编程马拉松复赛第二场(3月30日)
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; int state[170],Num[170],len; int a[102]; int befor[170][170],now[170][170]; void Init() { int i,k=1<<10; int ans,x; len=0; for(i=0;i<k;i++) { if( (i&(i<<2)) || (i&(i>>2)) ); else{ state[len]=i; x=i; ans=0; while(x) { ans++; x=(x-1)&x; } Num[len++]=ans; } } } void make_Init(int n,int m) { int i,j,k=1<<m; int hxl; memset(befor,0,sizeof(befor)); memset(now,0,sizeof(now)); if(n==1) { hxl=0; for(i=0;i<len&&state[i]<k;i++) { if( (state[i]&a[1])==state[i] ) if(hxl<Num[i]) hxl=Num[i]; } printf("%d\n",hxl); return; } for(i=0,hxl=0;i<len&&state[i]<k;i++) { if( (state[i]&a[2])!=state[i] ) continue; for(j=0,hxl=0;j<len&&state[j]<k;j++) { if( (state[j]&a[1])!=state[j] ) continue; if( ((state[i]<<1)&state[j]) || ((state[i]>>1)&state[j]) ) continue; befor[i][j]=Num[i]+Num[j]; if(hxl<befor[i][j]) hxl=befor[i][j]; } } if(n==2) { printf("%d\n",hxl); } } void solve(int n,int m) { int i,j,k=1<<m; int t,s,hxl; make_Init(n,m); if(n==1||n==2) return; for(i=3;i<=n;i++) { for(j=0;j<len&&state[j]<k;j++) { if((state[j]&a[i])==state[j]) for(s=0;s<len&&state[s]<k;s++) { if((state[s]&a[i-1])!=state[s]) continue; if( ((state[j]<<1)&state[s]) || ((state[j]>>1)&state[s]) ) continue; hxl=0; for(t=0;t<len&&state[t]<k;t++) { if( (state[t]&a[i-2])!=state[t] ) continue; if( (state[j]&state[t]) || ((state[s]<<1)&state[t]) || ((state[s]>>1)&state[t]) ) continue; if(hxl<befor[s][t]) hxl=befor[s][t]; } now[j][s]=hxl+Num[j]; } } for(j=0;j<len&&state[j]<k;j++) for(s=0;s<len&&state[s]<k;s++) { befor[j][s]=now[j][s]; now[j][s]=0; } } hxl=0; for(j=0;j<len&&state[j]<k;j++) for(s=0;s<len&&state[s]<k;s++) if( hxl< befor[j][s] ) hxl=befor[j][s]; printf("%d\n",hxl); } int main() { int n,m; int i,j,x; Init(); while(scanf("%d%d",&n,&m)>0) { for(i=1;i<=n;i++) { a[i]=0; for(j=1;j<=m;j++) { scanf("%d",&x); a[i]=a[i]<<1; a[i]+=x; } } solve(n,m); } return 0; }
相关文章推荐
- Knockout 是什么?
- 多核时代的移动开发(一)-函数式编程思想到来
- 解决ActivityGroup的sub Activity中spinner的WindowManager$BadTokenException的问题
- 基于Lex 和 Yacc 的 C 语言编译器
- windows 2003 域控制器(AD)的常规命令行操作以及修复
- 工作之命令小总结(3):scp命令
- 浅谈SQLite——浅析Lemon
- Compare the value of entity field.
- DB2中NULL值和空字符串问题
- PHP String 函数
- DotNetOpenAuth搭建OAuth2.0
- 在Visual Studio2008中搭建lex和yacc调试环境
- a huge kindle library for learning English(13000 books)
- AspNetPager分页样式及用法
- Git出现fatal: Unable to find remote helper for 'https'
- Java线程:创建与启动
- Java静态变量块使用案例
- DOM对XML文档的增删改查
- hdu-2027-统计元音
- 数据字典生成Java代码