Algorithm 盗取的最大价值
假设我们有一袋金子,小偷想得到最多的金子。盗贼可以通过 1) 从相邻的袋子里取出金子 2) 小偷应该从所有的袋子里拿走同样数量的金子Algorithm 盗取的最大价值,algorithm,data-structures,dynamic-programming,knapsack-problem,greedy,Algorithm,Data Structures,Dynamic Programming,Knapsack Problem,Greedy,假设我们有一袋金子,小偷想得到最多的金子。盗贼可以通过 1) 从相邻的袋子里取出金子 2) 小偷应该从所有的袋子里拿走同样数量的金子 N Sacks 1目前我看到两种不同的方法: 简单方法:对于数组中的每对索引(i,j),计算区间(i,j)中数组的最小值m(i,j),然后计算得分(i,j)=j-i+1 |*m(i,j)。然后取所有对的最大分数(i,j) ->O(n^3)的复杂性 不那么天真的方法: 计算数组的值集 对于每个值,计算它能得到的最大分数。为此,您只需在数组的所有值上迭代一次。例如,当
N Sacks 1目前我看到两种不同的方法: 简单方法:对于数组中的每对索引(i,j),计算区间(i,j)中数组的最小值m(i,j),然后计算得分(i,j)=j-i+1 |*m(i,j)。然后取所有对的最大分数(i,j) ->O(n^3)的复杂性 不那么天真的方法:
也许有更好的复杂性,但我还不知道。目前我看到两种不同的方法: 简单方法:对于数组中的每对索引(i,j),计算区间(i,j)中数组的最小值m(i,j),然后计算得分(i,j)=j-i+1 |*m(i,j)。然后取所有对的最大分数(i,j) ->O(n^3)的复杂性 不那么天真的方法:
注意,栈总是包含严格增加的权重序列的索引,所以我们不需要考虑在堆栈顶部的索引之前的项目(中间AG)在被盗金额的计算中(稍后将用另一个AG值考虑)。 每个项目都会被推送和弹出一次,所以时间和空间的复杂性是线性的
另外,我觉得我曾经在另一个公式中看到过这个问题……从每袋黄金中提取的最佳黄金量(TBAG)等于某袋黄金的重量。让我们将候选索引按顺序放在堆栈中 当我们遇到更重的重量(比堆栈包含的重量)时,它肯定会继续“良好序列”,所以我们只需将其索引添加到堆栈中 当我们遇到较轻的重量(比堆栈顶部)时,它会打破一些“良好序列”,我们可以从堆栈中删除较重的候选对象-他们以后将没有机会成为TBAG。移除烟囱顶部,直到达到较轻的重量,在此过程中计算可能被盗的金额注意,栈总是包含严格增加的权重序列的索引,所以我们不需要考虑在堆栈顶部的索引之前的项目(中间AG)在被盗金额的计算中(稍后将用另一个AG值考虑)。 每个项目都会被推送和弹出一次,所以时间和空间的复杂性是线性的
另外,我觉得我曾经在另一个公式中看到过这个问题……为什么它不能解决这个问题?您使用的算法是什么(实际代码还是伪代码)?有任何限制吗?袋子的最大数量是多少?每袋黄金的最小值和最大值?@AJD,请找到我的代码以找到索引,
int temp[6];对于(i=1;i=0;j--){temp[j]=a[j]-a[i];}}对于(i=0;i=0){index=i;break;}
@PhamTrung,每个袋子中不会有黄金的最小值或最大值。这就像,所有袋子里的黄金价值相等,但是袋子里可能含有不同数量的黄金。我们必须找到最大数量的黄金,一个小偷可以从一个连续的袋子和同等数量。请参阅示例输入和输出以进一步澄清。@Phamtrong,如果是这种情况,那么我的算法将无助于使复杂性低于O(n*n)。但是,如果m为什么不能解决问题?您使用的算法是什么(实际代码还是伪代码)?有任何限制吗?袋子的最大数量是多少?每袋黄金的最小值和最大值?@AJD,请找到我的代码以找到索引,int temp[6];对于(i=1;i=0;j--){temp[j]=a[j]-a[i];}}对于(i=0;i=0){index=i;break;}
@PhamTrung,每个袋子中不会有黄金的最小值或最大值。这就像,所有袋子里的黄金价值相等,但是袋子里可能含有不同数量的黄金。我们必须找到最大数量的黄金,一个小偷可以从一个连续的袋子和同等数量。请参阅示例输入和输出以了解进一步的说明@
int temp[6];
for(i=1;i<6;i++){
for(j=i-1; j>=0;j--) {
temp[j] = a[j] - a[i];
}
}
for(i=0;i<6;i++){
if(temp[i]>=0) {
index =i;
break;
}
}
for idx in Range(Sacks):
while (not Stack.Empty) and (Sacks[Stack.Peek] >= Sacks[idx]): //smaller sack is met
AG = Sacks[Stack.Pop]
if Stack.Empty then
firstidx = 0
else
firstidx = Stack.Peek + 1
//range_length * smallest_weight_in_range
BestSUM = MaxValue(BestSUM, AG * (idx - firstidx))
Stack.Push(idx)
now check the rest:
repeat while loop without >= condition