阿里笔试扑克牌题目 (记忆化回溯+剪枝)

阿里笔试扑克牌题目

阿里笔试扑克牌题目 (记忆化回溯+剪枝)


```python
class Main():
    def __init__(self):
        self.memo={}
    def main(self):
        lt=input().split(' ')
        lt=[int(i) for i in lt]
        def inter(lt,ind):
            # print (lt,ind)
            res=[]
            if ind>=len(lt):
                return 0
            if lt[ind]==0 and ind==len(lt)-1:
                return 0
            if lt[ind]==0:
                return inter(lt,ind+1)
            if lt[ind]>0 and ind==len(lt)-1:
                return lt[ind]

            if ind+4<len(lt) and lt[ind]>0 and lt[ind+1]>0 and lt[ind+2]>0 and lt[ind+3]>0 and lt[ind+4]>0:
                # print(111)
                t=lt[::]
                # print ('t',t)
                for i in range(ind,ind+5):
                    t[i]-=1
                p=ind+5
                for i in range(ind,ind+5):
                    if t[i]>0:
                        p=i
                        break
                # print (t,p)
                if (tuple(t),p) in self.memo:
                    temp=self.memo[(tuple(t),p)]
                else:
                    temp=inter(t,p)
                res.append(temp+1)

            if lt[ind]>1:
                # print (222)
                t=lt[::]
                t[ind]-=2
                if t[ind]==0:
                    p=ind+1
                else:
                    p=ind
                # print (t, p)
                if (tuple(t),p) in self.memo:
                    temp=self.memo[(tuple(t),p)]
                else:
                    temp = inter(t, p)
                res.append(temp + 1)

            if lt[ind]>0:
                # print (333)
                t = lt[::]
                t[ind] -= 1
                if t[ind] == 0:
                    p = ind + 1
                else:
                    p = ind
                # print (t, p)
                if (tuple(t), p) in self.memo:
                    temp = self.memo[(tuple(t), p)]
                else:
                    temp = inter(t, p)
                res.append(temp + 1)
            # print (ind)
            result=min(res)
            self.memo[(tuple(lt), ind)]=result
            return result
        r=inter(lt,0)
        print (r)
solu=Main()
solu.main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值