这里不严格展开,只简单分析一下算法SOLVE的时间复杂度。由于此算法是基于递归公式A的,假设对任一局面N有Cond(N) = Vol(N)-1 则可将公式展开为:
......
实际上,从题目的要求可知,假设球的总数为M,那么首轮决策取球数不应该超过low(M/2),low()为向下取整函数;如果M为偶数的话首轮取球数最多为:M/2-1。否则的话,按游戏规则,最后一个球一定会被对方取走。因此判断一个局面N是否有解,只要考虑子局面Ci(N)解的情况,其中1≤ i ≤low(Vol(N)/2),或考虑局面所有球是否可以被当前决策方全取走,即可。为此得到以下新算法:
SOLVE_OPT(m, cnd)
if m%2 == 1
then return 1
if aySitu[m].vol == cnd
then return 1
half = low(m/2)
if aySitu[m] initiated
then if cnd <= half
then return (int)anySitu[m].pSCond[cnd].v
else return 0
aySitu[m].vol = m
for c <- 1 to half //condition
do h <- 0
rear(aySitu[m].pSCond) <- create SCond
for d <- 1 to c
do h <- h + SOLVE(m-d,d)
if h==c
then aySitu[m].pSCond[c].v = flase
else aySitu[m].pSCond[c].v = true;
aySitu[m].pSCond[c].cond = c
return (int)aySitu[m].pSCond[m].v
算法SOLVE_OPT在原算法SOLVE的基础上作了以下改进:将SOVLE的中的m除2并向下取整,所得值赋给变量half;原第5行的控制逻辑,被改写,当传入的条件值cnd小于等于half时,仍由原来逻辑控制,当cnd大于half时,意味着取球数将会超过当前局面球数的一半,故必无解;原第11行中的m-1用half变量取代,从而使得每个局面的PScond链表的结点数也大大减少;SOLVE_OP新增的第1、2行主要是针对局面值是奇数的情况,在此情况下,当前选择方取球数只要小于局面值的1/2,就保证能取到最后一个球,故必有解。
假设不考虑局面条件的限制,SOLVE_OPT按递归公式A可以展开为:
......
算法SOLVE_OPT,可以接受。