首页 > 其他分享 >P2734 游戏 A Game

P2734 游戏 A Game

时间:2022-12-22 17:11:40浏览次数:30  
标签:return 游戏 int dfs 玩家 P2734 Game 15

P2734 游戏 A Game

有 \(N\) 个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一段取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。现在假设两个玩家都采取最优策略,输出最优玩家一和玩家二的最终分数?

例如: \(v = \{8,15,3,7\}\) ,先手拿 \(7\) ,对手拿 \(8\) ;先手再拿 \(15\) ,对手拿 \(3\) 结束,先手拿到的最大价值为 \(7 + 15 = 22\)

思路:

贪心?

显然不行,刚刚的案例如果用贪心的话,先手第一次拿 \(8\) 对手一定拿 \(15\) ,最终先手的值肯定不如刚刚的选法。

想到每次可以选 \(a[i]\) 或者 \(a[j]\) (这里的 \(i\),\(j\) 是指此时的头尾)。

定义 \(f[i][j]\) 为当前的人采取最优策略得到的值,存的值为玩家一与玩家二的差值。

就可以得到转移方程:

\(f[i][j] = max(f[i + 1][j] + a[i],f[i,j - 1] + a[j]])\) (如果当前是玩家一的话)

\(f[i][j] = min(f[i + 1][j] - a[i],f[i,j - 1] - a[j]])\) (如果当前是玩家一的话)

可以通过当前 \(i + j\) 的奇偶性来判断或者传一个参数来标记当前是谁选择。

然后因为是不断向中间逼近,所以这里采用自顶向下的记忆化搜索来写。

最后得到的答案 \(f[1][n]\) 是玩家一和玩家二的差值。

假设玩家一的最终值为 \(x\) ,玩家二的最终值为 \(y\) 。

  • 两个玩家的总和一定为全部元素之和: \(x + y = sum\)
  • 玩家一和玩家二的差值: \(x - y = f[1][n]\)

通过两个公式就可以得到两个变量的具体值了。

实现:

#include <bits/stdc++.h>
using namespace std;
const int N = 105, Min = -1e9;
int a[N], n;
int f[N][N];
int dfs(int u, int i, int j)
{
    if (i == j)
    {
        if (u)
            return f[i][j] = a[i];
        else
            return f[i][j] = -a[i];
    }

    if (f[i][j] != Min)
        return f[i][j];

    if (u)
        f[i][j] = max(dfs(u ^ 1, i + 1, j) + a[i], dfs(u ^ 1, i, j - 1) + a[j]);
    else
        f[i][j] = min(dfs(u ^ 1, i + 1, j) - a[i], dfs(u ^ 1, i, j - 1) - a[j]);

    return f[i][j];
}

int main()
{
    scanf("%d", &n);
    int sum = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }
    for (int j = 0; j <= n; j++)
        for (int k = 0; k <= n; k++)
            f[j][k] = Min;

    dfs(1, 1, n);
    int dif = f[1][n];
    int rex = (sum + dif) / 2;
    printf("%d %d\n", rex, sum - rex);
    return 0;
}

标签:return,游戏,int,dfs,玩家,P2734,Game,15
From: https://www.cnblogs.com/zxr000/p/16999166.html

相关文章

  • 盘点2022年日赚万金的爆款小程序游戏
    紧随微信2017年上线小程序平台,11月份便开始向各大小游戏厂商发送邀请函开发微信小游戏。2017年12月28日,微信正式对外开放微信小游戏。就微信小游戏来说,其开发者数量在今年已......
  • 小游戏进入增长快车道,行业变现模式分析
    根据《2022微信小游戏增长白皮书》显示,目前微信小游戏开发者数量已经超过10万人次,特别是在持续出现小游戏爆火社交平台的趋势下,小游戏发展势头强劲。此外仅看微信小游戏的商......
  • openharmony 游戏开发探索之军棋翻翻棋实现
    openharmony游戏开发探索之军棋翻翻棋实现一,引言大家也经常看到市面上有斗地主,麻将,飞行棋等不是很复杂的棋类游戏;然后作为没有开发过游戏的我,在思考一款游戏是如何开发的......
  • NFT商城游戏开发及存储技术
     NFT,终极意义上说,是一种数字媒体形式,就像其他数字媒体一样,从Decrypt文章中的文字到YouTube视频和流媒体音乐,最基本的形式都是由1和0组成的数据,NFT也不列外。更多软件开发......
  • 关于年会抢红包游戏的一个思考
    关于年会抢红包游戏的一个思考1.游戏介绍0x1:游戏规则该游戏名叫红包接龙,规则如下:年会会场内所有人都通过钉钉群的方式参与该游戏,会场人数一般为200......
  • 游戏设计之-排行榜处理
    前言我相信大部分人,乃至公司和团队在设计排行榜都考虑的是redis,zadd操作,不需要排序,维护获取,操作都极其简单;无一例外我也是;  在项目中运营了大量的模板,来处理各个木......
  • MOOD|所以真的是“游戏”的问题吗?
       刚刚我妈抢走了我的手机和平板,因为我在平板上玩游戏。   我没想到这些会发生在一个21岁的人身上。不过好像在我和我妈之间,每天都在发生着一些荒诞且幼稚的事......
  • Delphi 经典游戏程序设计40例 的学习 例40 动画检查器
     unitR40;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,Buttons,StdCtrls,Clipbrd,ExtCtrls;......
  • UE4学习笔记26——【UI】UI动画和暂停游戏
    P68.UI动画和暂停游戏P68(需要包含第一人称射击模板) 新建一个文件夹(WJJ2119P68),在此文件夹中,右键“用户界面——控件蓝图”,重命名为“Pause”,然后打开此控件蓝图;左......
  • Unity Editor批量重命名GameObject和Prefab
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEditor;usingUnityEngine;publicclassRenameEidtor:Editor{staticreadonlych......