排成一条线的硬币博弈问题

这是一个关于两个玩家轮流拿取硬币的游戏,硬币面值正数且按顺序排列。每轮玩家可以选择拿走最左边或最右边的硬币。游戏目标是使自己拿走的硬币总和最大。通过策略分析,可以确定获胜者及其得分。例如,硬币面值为[8, 7, 5, 3]时,玩家1能获胜并得分为13;而硬币面值为[1, 9, 1]时,玩家2获胜,得分为9。该问题可能不需借助动态规划(dp)数组解决。" 45915753,4919449,Android 应用窗口与OptionMenu详解,"['Android开发', 'UI设计', '应用框架', '菜单']

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

面值为正数的硬币放置成一排,玩家1和玩家2轮流拿走硬币,规定每个玩家在拿硬币时,只能拿走最左或最右的硬币。 例如: 硬币面值与排列为:1,2,3,4,5,现在轮到玩家1拿硬币。 在当前状态下,玩家1只能拿走1或5, 如果玩家1拿走1,则排列变为2,3,4,5,那么接下来玩家2可以拿走2或5,然后继续轮到玩家1拿硬币… 如果玩家1拿走5,则排列变为1,2,3,4,那么接下来玩家2可以拿走1或4;然后继续轮到玩家1拿硬币… 游戏按照这个规则进行,直到所有的硬币被拿完,每个玩家获得的分数是各自拿走硬币的总和。 游戏胜负的规定: 如果玩家1最后获得的分数大于玩家2,则玩家1获胜; 如果玩家2最后获得的分数大于玩家1,则玩家2获胜; 因为玩家1先拿硬币,所以如果最后两人获得分数一样则玩家2获胜; 给定一个数组arr,表示硬币的面值和排列状况,请返回最终获胜者的分数。 例子: arr=[8,7,5,3] 玩家1将获胜,分数为13 所以返回13 arr=[1,9,1] 玩家2将获胜,分数为9 所以返回9

class Solution {
public:

     int memorized_dfs(int i, int j, vector<vector<int> > &dp, vector<int> &A) {
        if (i == j)
            return dp[i][j] = A[i];
        else if (i > j)
            return 0;

        int v = max(min(A[i] + memorized_dfs(i + 2, j, dp, A),          /* 先手拿左边, 后手拿剩下的左边 */
                        A[i] + memorized_dfs(i + 1, j - 1, dp, A)),     /* 先手拿左边, 后手拿剩下的右边 */
                    min(A[j] + memorized_dfs(i + 1, j - 1, dp, A),        /* 先手拿右边, 后手拿剩下的左边 */
                        A[j] + memorized_dfs(i, j - 2, dp, A)));        /* 先手拿右边, 后手拿剩下的右边 */

        return dp[i][j] = v;
    }

    /**
     *  得到硬币博弈问题的获胜分值
     *  输入:代表硬币排列情况的数组arr
     *  返回:硬币博弈问题的获胜分值
     */
    int getWinValue(vector<int> arr, int len) {

         vector<vector<int> > dp(len, vector<int>(len, -1));
        int sum = 0;
        for (int i = 0; i < arr.size(); ++i)
            sum += arr[i];

        int first = memorized_dfs(0, len - 1, dp, arr);
        int second = sum - first;

        return max(first, second);

    }
};

本题中dp数组应该不是必须的吧?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值