笔试刷题 | 动态规划-博弈问题

本文深入探讨了动态规划在解决博弈问题中的应用,通过实例解析如何制定最优策略。通过学习,读者将理解如何运用动态规划解决复杂博弈场景,提升算法思维能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#! /usr/bin/env python
# -*-coding:utf-8-*-
"""
Author: ChileWang
Created at 2020/03/20 15:59


Question:
问题:
有一排正数,代表数值不同的纸牌排成一条线,玩家A和玩家B都可以看到。


每位玩家在拿走数字的时候,都只能从最左和最右的数中选择一个。


玩家A先拿,玩家B再拿,两人交替拿走所有的数字,


两人都力争自己拿到的数的总和比对方多。请返回最后获胜者的分数。


 


例如:


5,2,3,4


玩家A先拿,当前他只能拿走5或者4。


如果玩家A拿走5,那么剩下2,3,4。轮到玩家B,此时玩家B可以选择2或4中的一个,…


如果玩家A拿走4,那么剩下5,2,3。轮到玩家B,此时玩家B可以选择5或3中的一个,…


Solution:
动态规划


"""




def card():
    """
    动态规划之博弈问题
    核心:斜着计算二维数组
    详细解析:https://zhuanlan.zhihu.com/p/107741899
    :return:
    """
    arr = [1, 2, 100, 4]
    arr = [3, 9, 1, 2]
    first = [[0] * len(arr) for _ in range(len(arr))]
    end = [[0] * len(arr) for _ in range(len(arr))]


    for i in range(len(arr)):
        first[i][i] = arr[i]


    for i in range(1, len(arr)):
        for j in range(len(arr)):
            if i + j < len(arr):
                first[j][j + i] = max(arr[j] + end[j+1][j + i], arr[j + i] + end[j][j + i - 1])
                end[j][j + i] = min(first[j + 1][j + i], first[j][j + i - 1])


    print(max(first[0][len(arr) - 1], end[0][len(arr)-1]))
    for s in first:
        print(s)
    print('-------')
    for s in end:
        print(s)
    return max(first[0][len(arr) - 1], end[0][len(arr)-1])




if __name__ == '__main__':
    card()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值