Algorithm 为什么DP解决方案适用于;您可以从卡中获得的最大积分”;问题太慢了?
鉴于这个问题: 有几张卡片排成一行,每张卡片都有一个 关联点数整数数组中给出的点数 信用卡积分 在一个步骤中,你可以从开头或结尾拿一张牌 排在第一位。你必须拿k牌 你的分数是你所拿牌的点数之和 给定整数数组cardPoints和整数k,返回 你能得到的最高分数 例1: 输入:cardPoints=[1,2,3,4,5,6,1],k=3 产出:12 说明:第一步之后,您的分数将始终为1。然而, 选择 最右边的第一张牌将使你的总分最大化。最优 策略是拿右边的三张牌,给最后的分数 1+6+5=12 限制条件: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 限
- 1缓存算法存储每个中间步骤。有很多这样的。例如,选取四个值的简单情况,以及算法在每一侧选取两个值的所有可能路径:
总共有6条不同的路径。所有这些都会导致相同的结果。这个简单的示例总共在缓存中生成了9个状态。对于10^5的上限,情况看起来更糟。总共有1 2 ... 4 3 1 3 ... 4 2 1 4 ... 3 2 3 4 ... 2 1 ...
(是的,那是50亿)可能的州。其中的每一个都将被探索。因此,如果没有TLE,您的内存就会耗尽 相反,您可以使用以下注意事项来构建更高效的算法:(10^5 + 1) * 10^5 / 2 = 5000050000
- 从任意一侧拾取值的顺序对最终结果都不重要
- 任何不是从左侧获取的值都必须从右侧获取,反之亦然。因此,如果必须总共拾取
值,并且从数组的左侧获取k
,则必须从右侧获取l
值k-l
是可疑的(您可能需要类似于字符串键=”“+开始+结束
)的内容,但TLE是因为您没有使用渐近最有效的算法。在这种情况下,DP是有问题的。效率不够高,大多数方法都使用前缀和。@Diegmarin确实缓存了键378,与start+”;“+end
3,78或
37,8相对应?
1234是
1234或
12,34,问题是(LeetCode#1423)。递归可能无法工作,因为输入大小为10^5,这意味着您可能需要分配尽可能多的堆栈帧。也许值得一提的是O(k)解决方案的复杂性
(10^5 + 1) * 10^5 / 2 = 5000050000