私はダイナミックプログラミングを通じて標準のロッド切断問題を解決しようとしています。見つけhereとhereとして、再発の関係があるように思わ:利益を最大化するための切削棒のアルゴリズム
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]
}
}
これが間違っている場合は、どこで誤りがあるのかを教えてください。
ここで問題を説明することはできますか?正確にロッドの切断問題とは何ですか? –