【发布时间】:2017-12-09 14:04:35
【问题描述】:
给定一个大小为 N 的数组。
此外,我们还提供了可以将数组的任何元素递增/递减 1 的操作。
我们的目标是使所有元素的 GCD(最大公约数)在最少的操作数中等于给定数 K。
因此,我们需要找到所需的最少操作数。
示例:假设 N=3 且数组为 [4,5,6] 且 K=5 则此处的答案为 2。 我们可以通过在一次操作中减小 6 的值并在第二次操作中将值增加 4 到 5 来将 GCD 设为 5。
我的做法: 我们的最终目标是这样的:
[x1 * k,x2 * k,....x3 ∗ k],其中 gcd(x1,x2....xn)=1 (xi ∗ k 是我们替换数组元素的位置位置与)
在单独的数组 DP[i][j] 中维护状态,其中 DP[i][j] = 使 [x1,x2...xi] 的 gcd 等于 j 所需的最少操作。
答案将是 DP[N][1],其中 N 是数组的大小。
但是由于这种方法显然取决于元素的范围,并且所有元素的范围都可以达到 1000000。此外,N、K 也可以达到 1000000。
有什么更好的方法来解决这个问题。 ?
【问题讨论】:
-
欢迎来到 Stack Overflow。家庭作业类型的问题是可以的,但请尝试问一些比“解决这个问题有什么更好的方法?”更具体的问题
-
输入或输出是否允许负值?
-
@Airhead 当然。我第一次 :) 感谢您的建议
-
@STF 仅限非负正整数
-
有专门的网页供新手使用。在这里阅读:stackoverflow.com/help/asking
标签: c++ algorithm dynamic-programming