棒切割的结果计算

时间:2018-08-28 19:20:22

标签: algorithm dynamic-programming clrs

我正在从CLRS书中学习杆切割算法。

我相信我理解逻辑,并且下面的解决方案已在this OJ上接受。

#include <climits>
#include <iostream>

using namespace std;

int prices[101];
int result[101];

int function(int length)
{

    if (length == 0)
        return 0;    

    if (result[length] != INT_MIN)
    {
        return result[length];
    }

    //calculate result for length
    //if cutting the rod is more profitable, this variable will get overwritten in the loop below
    int current_max = prices[length];

    for (int cut_size = 1; cut_size < length; cut_size++)
    {
        int a;
        int b;
        a = function(cut_size);     //this question is about this step
        b = function(length - cut_size);
        if (a + b > current_max)
            current_max = a + b;
    }
    result[length] = current_max;
    return current_max;
}

int main() {

    int number_of_test_cases;
    int length_of_rod;

    cin>>number_of_test_cases;

    while (number_of_test_cases--)
    {
        cin>>length_of_rod;

        for (int i = 1; i <= length_of_rod; i++)
        {
            cin>>prices[i];
            result[i] = INT_MIN;
        }

        //profit of cutting rod to size 1
        result[1] = prices[1];

        cout<<function(length_of_rod)<<endl;
    }
    return 0;
}

以上,我已经实现了本书中解释的逻辑,只是对本文进行了一些修改。

从书中,

1: let r[0..n] be a new array
2: r[0] = 0
3: for j = 1 to n
4:    q = -1
5:    for i = 1 to j
6:       q = max(q, p[i] + r[j-i])
7:    r[j] = q
8: return r[n]

p是一个输入数组,其中包含从1到n的杆长度的利润,并且r用于存储结果。

当r [i]已经包含可以出售长度为i的杆的最佳价格时,为什么在第6行上没有使用r [i]代替p [i]? r [i]可能包含比p [i]高的值,这意味着长度为i的棒在被切割后而不是一个个地卖出,可以得到更高的价格。当然,对于循环的最后一次运行,当i = j且长度j的杆没有被切割时,它必须为p [i],因为r [j]是正在计算的值,而不会还不存在。但是当杆被切割时,我对循环的其他运行感到困惑。

我的解决方案通过以下语句使用逻辑q = max(q, r [i] + r [j-i])-

a = function(cut_size);
b = function(length - cut_size);
if (a + b > current_max)
    current_max = a + b;

如果我根据该书用= = prices [cut_size]对其进行了修改,则它在OJ上仍然是成功的。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

i视为已切割的最后一个片的长度(总会是一个,如果不进行任何切割,则整个杆都是最后一块)。由于是单件商品,您从中获得的利润为p[i]。因此,该方法正在尝试进行所有可能的最后切割,并使用最大化价值的切割方法。