奶牛食物解题报告.doc_第1页
奶牛食物解题报告.doc_第2页
奶牛食物解题报告.doc_第3页
奶牛食物解题报告.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【问题描述】农夫约翰购买了一处肥沃的矩形牧场,分成M*N(1=M=12; 1=N=12)个格子。他想在那里的一些格子中种植美味的玉米。遗憾的是,有些格子区域的土地是贫瘠的,不能耕种。精明的约翰知道奶牛们进食时不喜欢和别的牛相邻,所以一旦在一个格子中种植玉米,那么他就不会在相邻的格子中种植,即没有两个被选中的格子拥有公共边。他还没有最终确定哪些格子要选择种植玉米。作为一个思想开明的人,农夫约翰希望考虑所有可行的选择格子种植方案。由于太开明,他还考虑一个格子都不选择的种植方案!请帮助农夫约翰确定种植方案总数。【输入格式】第一行:两个用空格分隔的整数M和N。第二行到第M+1行:第i+1行描述牧场第i行每个格子的情况,N个用空格分隔的整数,表示这个格子是否可以种植(1表示肥沃的、适合种植,0表示贫瘠的、不可种植)。【输出格式】一个整数,农夫约翰可选择的方案总数除以 100,000,000 的余数。【样例输入】2 31 1 10 1 0【样例输出】9【样例说明】给可以种植玉米的格子编号:1 2 34只种一个格子的方案有四种(1,2,3或4),种植两个格子的方案有三种(13,14或34),种植三个格子的方案有一种(134),还有一种什么格子都不种,则:4+3+1+1=9。【数据规模】对于30%的数据,N,M=4;对于100%的数据,N,M=12。【分析】把地图存在map中。先来看看对于单独一行来说,哪些状态是可行的。不考虑不能种的地,题目要求状态中不允许存在连续的1,这一要求可以用程序中的impossible函数来判断。经过判断后,将可行的状态存在st数组中。然后DP:fi,j表示在第i行中,状态为j的方案数。枚举第i-1行的状态k。要满足两个条件:1:j和mapi不能冲突,也就是不能有不能种的地。2:k和mapi-1不能冲突。3:j和k不能冲突。在满足这些条件的前提下,有:fi,j := fi,j + fi-1,kCode:const MM=100000000;varn,m,i,j,v:longint;cf:array0.4097,0.4097 of boolean;map:array0.100 of longint;ans:array0.100,0.4097 of longint;st:array0.4097 of longint;a:array0.100,0.100 of longint;function ok(x:longint):boolean;var i:longint;begin for i:=1 to m do if (x and(1 shl i)=2*(x and (1 shl (i-1)and(x and(1 shl i)0) then exit(false); exit(true);end;procedure checkline;var i:longint;begin st0:=0; for i:=0 to 1 shl m-1 do if ok(i) then begin inc(st0); stst0:=i; end;end;function ok2(x,y:longint):boolean;var i:longint;begin for i:=1 to m do if (x and(1 shl(i-1)0)and(x and (1 shl (i-1)=(y and (1 shl(i-1) then exit(false); ok2:=true;end;procedure checkok;var i,j:longint;begin fillchar(cf,sizeof(cf),false); for i:=1 to st0 do for j:=i to st0 do if ok2(sti,stj) then begin cfi,j:=true; cfj,i:=true; end;end;procedure dp;var i,j,k:longint;begin fillchar(ans,sizeof(ans),0); ans0,1:=1; map0:=1 shl m-1; for i:=1 to n do for j:=1 to st0 do if (stj or mapi)mapi then ansi,j:=-1 else for k:=1 to st0 do if (ansi-1,k-1)and(cfj,k) then ansi,j:=(ansi,j+ansi-1,k) mod MM;end;procedure print;var opt,i:longint;begin opt:=0; for i:=1 to st0 do if ansn,i-1 then opt:=(opt+ansn,i) mod MM; writeln(opt);end;beginassign(input,cowfood.in);reset(input);readln(n,m);for i:=1 to n dobegi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论