Algorithm 盗取的最大价值

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)的复杂性 不那么天真的方法: 计算数组的值集 对于每个值,计算它能得到的最大分数。为此,您只需在数组的所有值上迭代一次。例如,当

假设我们有一袋金子,小偷想得到最多的金子。盗贼可以通过

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)的复杂性

不那么天真的方法:

  • 计算数组的值集

  • 对于每个值,计算它能得到的最大分数。为此,您只需在数组的所有值上迭代一次。例如,当您的示例输入为[3 0 5 4 4]且您正在查找的当前值为3时,它将给您12分。(由于第一个索引,您将首先找到一个值3,然后由于从2到5的索引,您将得到12分)

  • 取步骤2中所有值的最大值

  • ->这里的复杂性是O(n*m),因为您最多需要执行步骤2的m次,并且步骤2可以在O(n)中完成


    也许有更好的复杂性,但我还不知道。目前我看到两种不同的方法:

    简单方法:对于数组中的每对索引(i,j),计算区间(i,j)中数组的最小值m(i,j),然后计算得分(i,j)=j-i+1 |*m(i,j)。然后取所有对的最大分数(i,j)

    ->O(n^3)的复杂性

    不那么天真的方法:

  • 计算数组的值集

  • 对于每个值,计算它能得到的最大分数。为此,您只需在数组的所有值上迭代一次。例如,当您的示例输入为[3 0 5 4 4]且您正在查找的当前值为3时,它将给您12分。(由于第一个索引,您将首先找到一个值3,然后由于从2到5的索引,您将得到12分)

  • 取步骤2中所有值的最大值

  • ->这里的复杂性是O(n*m),因为您最多需要执行步骤2的m次,并且步骤2可以在O(n)中完成

    也许有一个更好的复杂性,但我还没有一个线索。

    从每袋黄金中提取的最佳黄金量(TBAG)等于某袋黄金的重量。让我们将候选索引按顺序放在堆栈中

    当我们遇到更重的重量(比堆栈包含的重量)时,它肯定会继续“良好序列”,所以我们只需将其索引添加到堆栈中

    当我们遇到较轻的重量(比堆栈顶部)时,它会打破一些“良好序列”,我们可以从堆栈中删除较重的候选对象-他们以后将没有机会成为TBAG。移除烟囱顶部,直到达到较轻的重量,在此过程中计算可能被盗的金额

    注意,栈总是包含严格增加的权重序列的索引,所以我们不需要考虑在堆栈顶部的索引之前的项目(中间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