当保持在一条线上时收集总价值最大的卡片(仅从角落提取)[重复]

Posted

技术标签:

【中文标题】当保持在一条线上时收集总价值最大的卡片(仅从角落提取)[重复]【英文标题】:Collect cards of largest total value when kept in a line (extraction only from the corners) [duplicate] 【发布时间】:2015-05-25 12:11:41 【问题描述】:

考虑以下游戏。

庄家产生一个序列 s1 ...sn 的牌,面朝上,其中 每张卡片 si 都有一个值 vi。然后两个玩家轮流从序列中挑选一张牌,但是 只能选择(剩余)序列的第一张或最后一张牌。目标是收集卡片 总价值最大。 (例如,您可以将卡片视为不同面额的钞票。)

给出一个 O(n^2) 算法来计算第一个玩家的最佳策略(只是可获得的最大代码)。

我已经尝试过解决它,并且可能在这里解决它是我的代码...... 数组卡片有每张卡片的值。卡片的第 0 个元素未使用和浪费(基础索引 1)!

  #include<bits/stdc++.h>
  using namespace std;
  int main()
  
   int cards[]=0,2,100,101,1;
   int n=4;
   int i,j,l,sum=204;
   int dp[n+1][n+1];
   memset(dp,0,sizeof(dp));
   for(i=1;i<=n;i++)
      dp[i][i]=cards[i];
   for(l=2;l<=n;l++)
   
      for(i=1;i<=n-l+1;i++)
              
                  j=i+l-1;
                  dp[i][j]=max(cards[i]-dp[i+1][j],cards[j]-dp[i][j-1]);
               
    
    printf("%d\n",(sum+dp[1][n])/2);

    return 0;
    

在最后一个打印语句中,我打印了 (sum+dp[1][n])/2 只是因为元素是 2n,所以当我执行此操作时,n 将被包括在内,其余的 n 将被减去,我获取包含值的总和。

虽然它给出了正确的答案,但我仍然无法说出 dp[i][j] 到底代表什么!它不代表最大可获得值(因为它不会直接给我那个值)。 那么它表示我的另一个问题是什么??

有没有其他思路可以解决这样的问题?

【问题讨论】:

这听起来像是双端队列的完美用途,允许您推送/弹出第一个或最后一个值。我不会为此使用固定大小的数组。 【参考方案1】:

在您发布的代码中,dp[i][j] 代表第一个和第二个玩家可以从子字符串 i..j 开始获得的最大分数差:dp[i][j]=max(first[i][j]-second[i][j])(这不是编程语言公式,而是只是为了给出这个想法),这里我们称第一个球员是从那个位置开始的球员。

所以考虑一个子字符串i..j。第一个玩家 (A) 可以选择是拿第一张还是最后一张牌。如果他拿到第一张牌,他将得到cards[i],但他的对手(B)将从子字符串i+1..j开始。他会尽力而为,并得到对他有利的差额dp[i+1][j],即差额将是pointsB - pointsA = dp[i+1][j]。但是对于我们的位置i,j,我们对pointsA-pointsB 的差异感兴趣,所以我们取-dp[i+1][j] 并记住card[i],因此

dp[i][j]=card[i]-dp[i+1][j]

还有另一种变体,就是取最后一张牌,结果为

dp[i][j]=card[j]-dp[i][j+1]

显然,玩家会选择最佳选项,因此您应该取两个值中的最大值。

【讨论】:

事情现在清楚多了。我们可以用其他方式解决它吗? @ShubhamSharma,我看到的另一种(尽管非常相似)方法是保持dp[i][j] 第一个可以获得的最大总和。然后我们需要预先计算所有子字符串的总和,DP 公式将类似于dp[i][j]=max(card[i]+sum[i+1][j]-dp[i+1][j], ...)

以上是关于当保持在一条线上时收集总价值最大的卡片(仅从角落提取)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python 世界杯在一条线上。

markdown 在一条线上轻松安装最新的稳定chefdk

QT用QGraphics在一条线上画一个椭圆或三角形

Educational Codeforces Round 41

UVA - 1643 Angle and Squares (角度和正方形)(几何)

Educational Codeforces Round 41(已补D,E)