二叉树

在一个无穷的满二叉树中,有以下几个特点:
  (1) 每个节点都有两个儿子——左儿子和右儿子;
  (2) 如果一个节点的编号为X,则它的左儿子编号为2X,右儿子为2X+1;
  (3) 根节点编号为1。
  现在从根结点开始走,每一步有三种选择:走到左儿子、走到右儿子和停在原地。
  用字母“L”表示走到左儿子,“R”表示走到右儿子,“P”表示停在原地,用这三个字母组成的字符串表示一个明确的行走路线。
一个明确的行走路线的价值为最终到达节点的编号,例如LR的价值为5,而RPP的价值为3。
  我们用字符“L”、“R”、“P”和“*”组成的字符串表示一组行走路线,其中“*”可以是“L”、“R”、“P”中的任意一种,所有跟这个行走路线匹配的字符串都认为是可行的。
  例如L*R包含LLR、LRR和LPR。而**包含LL、LR、LP、RL、RR、RP、PL、PR和PP这9种路线。
  一组行走路线的价值等于所有匹配该模式的路线的价值之和。请你编程计算给定路线的价值。

Input

  输入一个字符串表示一组行走路线,里面只含有“L”、“R”、“P”和“*”四种字符,长度不会超过10000。

Output

  输出该路线的价值。

Sample Input

输入1:

P*P



输入2:

L*R



输入3:

**



输入4:

LLLLLRRRRRLLLLLRRRRRLLLLLRRRRRLLLLL

Sample Output

输出1:

6



输出2:

25


输出3:

33


输出4:

35400942560

 

方法如下:设A=1,B=1;

  ‘L’:A*2;

  ‘R’:A*2+B

  ‘P’:不变。

  ‘*’:A*2+B;B*3;

答案为A。至于为什么要乘三,我是靠数据算出来的,也推过,但效果不好,如有问题,请多加分析。来个彩蛋

 

标程:

const

 p=10000000;

type

 arr=array[0..5000] of longint;

var

 s:ansistring;

 n,i,t:longint;

 a,b,tt:arr;            

 h:string;

procedure gjj(b1:Arr;var a1:arr);

var i:longint;

   tt:Arr;

 begin

 fillchar(tt,sizeof(tt),0);

  fori:=5000 downto a1[0] do

  begin

  tt[i]:=tt[i]+a1[i]+b1[i];

  tt[i-1]:=tt[i] div p;

  tt[i]:=tt[i]-tt[i-1]*p;

  end;

  iftt[a1[0]-1]>0 then tt[0]:=a1[0]-1 else tt[0]:=a1[0];

 a1:=tt;

 end;

 

procedure gjc(b1:longint;var a1:arr);

var i,z,s:longint;

 begin

  fillchar(tt,sizeof(tt),0);

  fori:=5000 downto a1[0] do

   begin

   tt[i]:=tt[i]+a1[i]*b1;

   tt[i-1]:=tt[i] div p;

   tt[i]:=tt[i]-tt[i-1]*p;

   end;

  iftt[a1[0]-1]>0 then tt[0]:=a[0]-1 else tt[0]:=a[0];

 a1:=tt;

 end;

 

begin

 readln(s);

 a[5000]:=1;

 a[0]:=5000;

 b[5000]:=1;

 b[0]:=5000;

 fillchar(tt,sizeof(tt),0);

 fori:=1 to length(s) do

  begin

   cases[i] of

    'L':begingjc(2,a); end;

    'R':begingjc(2,a); gjj(b,a); end;

    '*':begingjc(5,a); gjj(b,a); gjc(3,b); end;

   end;

  end;

 fori:=a[0] to 5000 do

  begin

  str(a[i],h);

   while(length(h)<7) and (i<>a[0]) do

   h:='0'+h;

   write(h);

  end;

end.

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值