|
给猫猫转了章。
我的写法:没有必要每条路径都走到底,这样会快一些。
WITH t(box1,box2,lvl) AS (
SELECT 10,10,0 FROM DUAL
UNION ALL
SELECT DECODE(n,1,box1-1,box1)
,DECODE(n,2,box2-1,box2)
,lvl+1
FROM t,(SELECT 1 n FROM DUAL UNION ALL SELECT 2 FROM DUAL)
WHERE (box1>=5 and box2>0) or (box2>=5 and box1>0)
)
select lvl,count(*)
from t where box1=5 and box2=0 or box2=5 and box1=0
group by lvl;
LVL COUNT(*)
---------- ----------
15 4004
4004/power(2,15)=1001/power(2,13)=1001/8192
下面是手工算法:
假设(10,10)为初始状态,目标状态为(0,5)或者(5,0)。
每吃掉一颗糖到达的状态,概率为1/2^被吃糖数,所以每一种(0,5)或者(5,0)状态的概率为1/2^15
现在只需求出有多少条路径到达这两种状态。两种状态是对称的。
(0,5)状态下,第一盒吃掉10颗,第二盒吃掉5颗,需要求出吃掉顺序的组合。相当于把5颗放置到10颗中间有多少种方法。10颗连头尾总共有11个位置可以放置,但是由于最后一颗一定是第一盒,就剩下10个位置可以放置第二盒的5颗。
第二盒5颗的分配方法:
1组:C(10,1) = 10
2组:14,23,32,41 四种,C(10,2)*4 = 180
3组:113,131,311,122,212,221 共6种,C(10,3)*6 = 720
4组:1112,1121,1211,2111 四种,C(10,4)*4 = 840
5组:C(10,5) = 252
总和=2002
加上对称的(5,0)= 2002*2 = 4004
|
|