选球博奕与动态规划(四)

来源:互联网 发布:剑三苍云捏脸数据 编辑:程序博客网 时间:2024/05/21 17:14

        这里不严格展开,只简单分析一下算法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,可以接受。


原创粉丝点击