gpt4 book ai didi

algorithm - 子集和的DP解的空间优化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:09:55 26 4
gpt4 key购买 nike

我正在做正数的子集和问题。在典型的 DP 解决方案中,我们使用 table[n+1][sum+1] 形式的 2D DP 表,其中 n 是集合中元素的数量,sum 是目标总和。现在我想优化它只使用一行,因为所有行都使用前一行的结果。为此,我提出了一个解决方案:

boolean DP[] = new boolean[sum+1];
DP[0] = true;
for(int i = 0; i < arr.length; i++) {
for(int j = arr[i]; j <= sum; j++) {
DP[j] = DP[j] || DP[j-arr[i]];
}
}
return DP[sum];

此代码未通过某些测试用例。但是,如果我将内部循环更改为向后迭代:

for(int j = sum; j >= arr[i]; j--)

然后这段代码通过了所有的测试用例。我无法弄清楚向后迭代所产生的差异。我将不胜感激。

最佳答案

帮助理解的简单例子

arr = {1, 4}, sum = 7

如果迭代forward,第一次迭代,i = 0

dp[0] = true
for (int j = arr[0]; j <= sum; j++){

}

这是这个循环中的步骤:

dp[1] = dp[1] || dp[1 - 1]; //true as dp[0] = true
dp[2] = dp[2] || dp[2 - 1]; // also true, as previous step, we update dp[1] = true
....
dp[7] = dp[7] || dp[7 - 1]; // true for similar reason

因此,对于第一次迭代,所有元素都为真

向后迭代的情况下,第一次迭代,i = 0

dp[0] = true
for (int j = sum; j >= arr[0]; j--){

}

这是这个循环中的步骤:

dp[7] = dp[7] || dp[7 - 1]; //false 
dp[6] = dp[6] || dp[6 - 1]; // also false,
....
dp[1] = dp[1] || dp[1 - 1]; // true as dp[0] = true

因此,对于第一次迭代,除了 dp[1]dp[0] = true 之外的所有内容,这就是我们想要的。

关于algorithm - 子集和的DP解的空间优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51151923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com