ロッドカット問題は以下の通りです。長さがn
インチのロッドとのテーブルがi = 1, 2, 3,....n
の場合、棒を切断して販売することによって得ることができる最大収益Rn
を決定します。長さがn
の棒についての価格Pn
が十分に大きい場合、最適解は全く切断を必要としないことに留意されたい。
n=4
を考慮してください。図は、長さが4インチの棒を切り取るすべての方法を示しています。切り口を全く持たない方法を含みます。 4インチのロッドを2インチの2つの部分に切断すると、収入はP2+P2=5+5=10
となり、最適です。
以下のコードは、ロッド切断のためのソリューションを構築するボトムアップアプローチです。
for (i = 1; i<=n; i++)
{
int q = INT_MIN;
for (j = 0; j < i; j++)
q= max(q, p[j] + r[i-j-1]);
r[i] = q;
}
return val[n];
なぜ補助配列r[n+1]
が必要ですか?問題は、配列p
だけを使用して解決することはできませんでしたか?ロッドの長さnと0を切断するとp [-1]にアクセスできないので使用されますか? pが新しい値に更新されない場合、なぜq = max(q, p[j] + r[i-j-1])
を使用していますか?
誤解を避けるためにロッドカットの問題の定義を含めてください。 – Codor
例とともに追加しました。 –
内側のループの '-1'は私を少し困惑させます。 – Codor