ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

动态编程:获取“游戏中最大硬币”问题。

前开发者教程 2020年3月29日

在本章中,我们将解决如何在DP的帮助下获得游戏中最大硬币的问题。

 

问题陈述:

您和您的朋友正在玩游戏,以从偶数长度的数组中选择数字。您需要找到一种解决方案,以便可以选择最大金额,然后赢得比赛。

 

示例数组

取得游戏中的Max Coin问题。

 

您是玩家P1,您的朋友是玩家P2。

 

最初,您选择1

您的朋友选择2

你选1

您的朋友选择4

 

您的总数= 2

您的朋友总数= 6

 

因此,在这里您需要提出一个将成为赢家的策略。我们可以通过DP解决此问题。

 

考虑数组:

取得游戏中的Max Coin问题。

 

最初,下面将是我们的DP阵列:

 

取得游戏中的Max Coin问题。

因为我们有4个元素,所以我们采用4 x 4矩阵。让我们开始填充矩阵。我们将在[0,3]索引处获得结果。

 

因为有2个玩家,我们表示为[4,5]。此处,玩家1的获利4和玩家5的获利5。这意味着,玩家1的获利为1。 ST 元素,而玩家2的利润将是2 nd 元件。

 

因此,最初我们只有1个元素,即4,其索引为0。

 

因此,如果您只有'4',则将选择'4',播放器2将选择0。由于只有1个元素,而播放器1已选择它,播放器2将得到0。因此我们可以将DP数组填充为dp [0,0] = [4,0]。

 

同样,如果您只有8 dp [1,1] = [8,0]

同样,如果您只有1 dp [2,2] = [1,0]

同样,如果您只有2 dp [3,3] = [2,0]

 

更新后的DP表将为

 85_maximum_coin_problem

 

现在让我们在t时间取2个元素并进行计算。

 

首先,您有[4,8]。因此玩家P1将选择8,而玩家2将选择4。因此dp [0,1] = [8,4]。

 

接下来,您有[8,1]。这里P1 = 8,P2 = 1。

因此,dp [1,2] = [8,1]。

 

接下来,您有[1,2]。这里P1 = 2,P2 = 1。

因此,dp [2,3] = [2,1]。

 

因此,我们最终的DP数组将为:

86_maximum_coin_problem-min

 

从上面我们可以得出DP公式吗?是的,我们可以得出。

 

 

好吧,集中在下面:

对于索引dp [0,1],我们有元素[4,8]。如果玩家P1选择4,那么玩家P2选择8,那么玩家P1将不得不再次选择玩家P2之后剩下的。

 

最初,P1选择了4m P2选择了8。由于玩家P2选择了8,并且索引为1,因此您需要检查2 nd dp [1,1]中的值。 2 nd 值,即P2的值为0。您添加了选择的值,即4 + 0 = 4。

 

同样,如果您在[4,8]中选择8,P2将选择4。您需要检查2 nd 索引[0,0]的值为0,即0。您将选择的值添加为8 + 0 =8。现在您有2个值[4,8]。您需要取值的最大值,即8。因此我们得到[8,4]。

 

接下来,我们将选择3个元素[4、8、1],索引为[0、1、2],并使用与上述相同的方法求解。

 

因此,首先P1选择4,然后我们需要添加2 nd 索引[1,2]处的值,即4 +1 = 5。

 

否则P1选择1,那么我们需要加2 nd 索引[0,1]的值,即1 + 4 =5。无论如何,我们选择5。

 

并且P2将选择8。因此,对于dp [0,2] = [5,8]

 

现在我们将选择[8,1,2]

如果P1选择8,我们需要加2 nd 值[2,3]。

8 +1 = 9

 

如果P1选择2,我们需要加上2 nd 值[1,2]。

2 +1 = 3

 

由于[9,3]的最大值为9。P1将选择9。P2将采用我们选择的下一个值。即P2将花费1。

因此,dp [1,3] = [9,1]。

 

87_maximum_coin_problem-min

 

现在我们一次要考虑四个要素。

 

[4、8、1、2]和索引为[0、1、2、3]。

 

如果P1选择4,那么我们需要加2 nd 元素位于索引[1,3]。

即4 +1 = 5。

 

如果P1选择2,那么我们需要加2 nd 索引为[0,2]的元素。

即2 + 8 = 10。

 

我们将选择10,因为它是最大值,而2 nd 玩家获得4 +1 = 5。

 

因此最终dp [0,3] = [10,5]。

 

88_maximum_coin_problem-min

 

因此,结果。

 

C ++解决方案

#include <iostream> 
using namespace  ST d; 


int get_max_coin(int* arr, int n) 
{ 

    int dp_table[n][n]; 

    for (int gap = 0; gap < n; ++gap) 
    { 
        for (int i = 0, j = gap; j < n; ++i, ++j) 
        { 

            int x = 0;
            if(((i + 2) <= j))
            {
                x = dp_table[i + 2][j];
            }

            int y = 0;
            if((i + 1) <= (j - 1))
            {
                y = dp_table[i + 1][j - 1];
            }

            int z = 0;
            if((i <= (j - 2)))
            {
                z = dp_table[i][j - 2];
            }

            dp_table[i][j] = max( 
                arr[i] + min(x, y), 
                arr[j] + min(y, z)); 
        } 
    } 

    return dp_table[0][n - 1]; 
} 

int main() 
{ 
    int arr1[] = { 4, 8, 1, 2}; 
    int n = sizeof(arr1) / sizeof(arr1[0]); 
    cout<<"Ans : " <<get_max_coin(arr1, n)<<endl; 

    return 0; 
}

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节 最常见的编码问题
5G NR 50+章 Linux系统编程20+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的 的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权 © 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的
<summary class="YlHxy6l"><abbr class="KJOaw6r"></abbr></summary>



    <tt class="xa8sQjj"></tt>
    <sub id="BXaXKu8"></sub>


    <hr class="esKR8XV"><td id="aLn8SiJ"><sup class="rxFEiq1"></sup></td></hr>