2016-03-26 6 views
0

私はダイナミックプログラミングを通じて標準のロッド切断問題を解決しようとしています。見つけherehereとして、再発の関係があるように思わ:利益を最大化するための切削棒のアルゴリズム

prices = [1..n] 
array[1..n] 

array[1] = prices[1] 

for i in (2..n) 
{ 
    array[i] = INT_MIN 
    for j in (1..i-1) 
    { 
     array[i] = max(array[i],prices[j]+array[i-j]) 
    } 
} 

そしてarray[n]は、私たちの答えですnの値を返します。私の質問は、それは我々が長8の最大値を見つけようとしていると想像

array[i] = max(array[i],array[j]+array[i-j]) 

すべきではない

array[i] = max(array[i],prices[j]+array[i-j]) 

ラインです。ここで、4については、長さ4の単一ユニットを切断することによって得られる値が、3および1の切断長さによって得られる値よりも小さくなる、すなわちn = 4の場合、prices[4]が最適ではないことがわかります。しかし結果の配列をボトムアップするので、array[4]が最適です。だからarray[4]+array[4]prices[4]+array[4]と比べてn = 8の最大値になりませんか?私の結果の解決策は、次のようになります。

prices = [1..n] 
array[1..n] 

for i in (1..n) 
    array[i] = prices[i] //prices[i] is the minimum value we can obtain by cutting it fully 

for i in (2..n) 
{ 
    for j in (1..i-1) 
    { 
     array[i] = max(array[i],array[j]+array[i-j]) // find out all possible (j,i-j) pairs, and compare with array[i] 
    } 
} 

これが間違っている場合は、どこで誤りがあるのか​​を教えてください。

+0

ここで問題を説明することはできますか?正確にロッドの切断問題とは何ですか? –

答えて

1

array[i] = max(array[i],prices[j]+array[i-j])私には右のように見えます。

このアルゴリズムでは、jは、最初のカットのロッドの長さを表します。まず、長さがiの棒で始まり、jを切り捨てます。次に、i - jのロッドをどれだけ得ることができるかを知る必要があります。これは、jの長さを切り捨てただけなので、i - jのままです。しかし、ロッドを全体として販売したり、ロッドをカットして価値を高めたりするという選択肢があるので、少なくともこの値はprice[i-j]と高いことがわかります。

例:私たちは、配列[]は既に1,2,3のための最適値が含ま仮定長さ4のロッドを有する その後、我々は:

は長さ1の部分を切断

、その後どのようにチェック多くの我々は3

は、長さ2の部分をカットオフ長さの棒のために取得することができ、その後、我々は2

は長さ3の一部を切断した長さの棒のため を得ることができますどのくらい確認し、その後、確認してください長さ1の棒のためにどれくらい得ることができるか

最大を選択します。

我々はarray[i] = max(array[i],array[j]+array[i-j])

array[k]を使用した場合、我々は小片にカット場合は長さkのロッドの最大値を含みます。したがって、これらの値は、price[k]を使用した場合と比べて予想外に高くなります。

また、現在の再帰ステップでは、カットを1つ作成し、残りの最大値をチェックするのではなく、両側の最大値をチェックします(大きなカットの値が理想)

+0

申し訳ありませんが、私はこの行を取得しませんでした - 'array [k]には長さkの棒の最大値が含まれています。したがって、これらの値は、我々が価格[k]を使用した場合と比較して予想外に高くなります。もう少し説明していただけますか? – SexyBeast

+0

確かに - Price [k]は全体として長さkの棒の値です。配列(k)は少なくとも値段以上でなければなりません(price(k)のために)**または**値を加算したものにカットすることができます価格[k]以上。また、我々は決して価格の配列を参照してください、その後、任意のロッドの値は常に価格[1]です*長さ – Chris

+0

うーん、それは、そのアイデアだよね?私が 'n = 8'のために最高のカットをしようとしているとき、私はそれを生み出す最良の組み合わせを知る必要があります。もし 'array [4]'が 'prices [4]'以上であれば、明らかに 'prices [4] + prices [4]'は 'array [4] + array [4]'よりも小さくなります。 ? 'n = 4'の場合、' array [4] 'に最適な解がすでに格納されているので、なぜ' prices [4] 'と相談する必要がありますか? 'array [4]'の初期値はすでに 'prices [4]'だったので、 'array [4]'の最終値が更新されると、スタンドアロンのカットとサブコンビネーションが考慮され、最高の1つ、そうですか? – SexyBeast

関連する問題