NOIP2008T3 传球游戏

 

动态规划

//为了方便边界跨越,人的数组下标从0开始。a[i,j]编号为i的人表示j次传球以后有多少种方式获得球。
var n,m,i,j:longint;
    a:array[0..30,0..30] of longint;
begin
    assign(input,'ballg.in'); reset(input);
    assign(output,'ballg.out'); rewrite(output);
    readln(n,m);
    for i:=1 to n-1 do a[i,0]:=0;
    a[0,0]:=1;//球还没有开始传,在0号,即小蛮手中
    for j:=1 to m do//表示第几次传球
        for i:=0 to n do
            a[i,j]:=a[(i+1) mod n,j-1]+a[(i-1+n) mod n,j-1];//每个人只能从上一个或下一个人手中拿到球
    writeln(a[0][m]);
    close(input); close(output);
end.


DFS(WA40)

var n,m:longint;
    ans:int64;
procedure find(i,j:integer);
begin
  if (i=m)  then
    begin
       if j=1 then
       ans:=ans+1;
    exit;
  end;
  find(i+1,j mod n+1);
  if j=1  then
  find(i+1,n)
  else find(i+1,j-1);
end;
begin
  readln(n,m);
  if (n mod 2=0) and (m mod 2=1) then
    begin
      writeln('0');
      halt;
    end;
  find(0,1);
  writeln(ans);
end.

 

 

var n,m,c,i:longint;
    ans:int64;
    next,pre:array[1..1000] of longint;
procedure DFS(j:integer);
begin
  if(c=m) then
  begin
      if j=1 then ans:=ans+1;
      exit;
  end;
  inc(c); DFS(next[j]); dec(c);
  inc(c); DFS(pre[j]); dec(c);
end;
begin
    readln(n,m);
    if (n mod 2=0) and (m mod 2=1) then begin writeln('0'); halt; end;
    for i:=1 to n-1 do next[i]:=i+1; next[n]:=1;
    for i:=2 to n do pre[i]:=i-1; pre[1]:=n;
    c:=0;
    DFS(1);
    writeln(ans);
end.

 

 

var n,m,i:longint;
    ans:int64;
    next,pre:array[1..1000] of longint;
procedure DFS(i,j:integer);
begin
  if(i=m) then
  begin
      if j=1 then ans:=ans+1;
      exit;
  end;
  DFS(i+1,next[j]);
  DFS(i+1,pre[j]);
end;
begin
    readln(n,m);
    if (n mod 2=0) and (m mod 2=1) then begin writeln('0'); halt; end;
    for i:=1 to n-1 do next[i]:=i+1; next[n]:=1;
    for i:=2 to n do pre[i]:=i-1; pre[1]:=n;
    DFS(0,1);
    writeln(ans);
end.

 

 

转载于:https://www.cnblogs.com/qilinart/articles/3389597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值