Algorithm 为什么DP解决方案适用于;您可以从卡中获得的最大积分”;问题太慢了?

Algorithm 为什么DP解决方案适用于;您可以从卡中获得的最大积分”;问题太慢了?,algorithm,dynamic-programming,Algorithm,Dynamic Programming,鉴于这个问题: 有几张卡片排成一行,每张卡片都有一个 关联点数整数数组中给出的点数 信用卡积分 在一个步骤中,你可以从开头或结尾拿一张牌 排在第一位。你必须拿k牌 你的分数是你所拿牌的点数之和 给定整数数组cardPoints和整数k,返回 你能得到的最高分数 例1: 输入:cardPoints=[1,2,3,4,5,6,1],k=3 产出:12 说明:第一步之后,您的分数将始终为1。然而, 选择 最右边的第一张牌将使你的总分最大化。最优 策略是拿右边的三张牌,给最后的分数 1+6+5=12 限

鉴于这个问题:

有几张卡片排成一行,每张卡片都有一个 关联点数整数数组中给出的点数 信用卡积分

在一个步骤中,你可以从开头或结尾拿一张牌 排在第一位。你必须拿k牌

你的分数是你所拿牌的点数之和

给定整数数组cardPoints和整数k,返回 你能得到的最高分数

例1:

输入:cardPoints=[1,2,3,4,5,6,1],k=3

产出:12

说明:第一步之后,您的分数将始终为1。然而, 选择 最右边的第一张牌将使你的总分最大化。最优 策略是拿右边的三张牌,给最后的分数 1+6+5=12

限制条件:


  • 1缓存算法存储每个中间步骤。有很多这样的。例如,选取四个值的简单情况,以及算法在每一侧选取两个值的所有可能路径:

    1 2 ... 4 3
    1 3 ... 4 2
    1 4 ... 3 2
    3 4 ... 2 1
    ...
    
    总共有6条不同的路径。所有这些都会导致相同的结果。这个简单的示例总共在缓存中生成了9个状态。对于10^5的上限,情况看起来更糟。总共有

    (10^5 + 1) * 10^5 / 2 = 5000050000
    
    (是的,那是50亿)可能的州。其中的每一个都将被探索。因此,如果没有TLE,您的内存就会耗尽

    相反,您可以使用以下注意事项来构建更高效的算法:

    • 从任意一侧拾取值的顺序对最终结果都不重要
    • 任何不是从左侧获取的值都必须从右侧获取,反之亦然。因此,如果必须总共拾取
      k
      值,并且从数组的左侧获取
      l
      ,则必须从右侧获取
      k-l

    字符串键=”“+开始+结束
    是可疑的(您可能需要类似于
    start+”;“+end
    )的内容,但TLE是因为您没有使用渐近最有效的算法。在这种情况下,DP是有问题的。效率不够高,大多数方法都使用前缀和。@Diegmarin确实缓存了键378,与
    3,78或
    37,8相对应?
    1234是
    1234或
    12,34,问题是(LeetCode#1423)。递归可能无法工作,因为输入大小为10^5,这意味着您可能需要分配尽可能多的堆栈帧。也许值得一提的是O(k)解决方案的复杂性
    
    (10^5 + 1) * 10^5 / 2 = 5000050000