私は現在、いくつかの動的プログラミングを練習中です。私はBox of Stackを見つけました。
ボックスは、のように表される:ボックスのスタック - 動的プログラミング
struct Box{
double h;
double w;
double d;
};
問題は、スタック内の各ボックスは、その上よりも(幅および深さの両方において)、大きい箱の最高スタックを作成しています。この場合、ボックスは回転できないとします。
私はボックスをstd::vector<Box>
に保存しています。私は最初に幅と深さで安定した並べ替えをしています。そのため、ボックスを選択するたびに、次に収まるボックスを前方に検索する必要があります。
これは私の質問です - 最適ですか?
私はボックスを選ぶたびに、次のボックスを選択するために線形時間(O(n))を検索する必要があると思います。
時間の複雑さが改善される可能性のあるボックスを保存する方法はありますか?
他の最適化ももちろん歓迎します。
私の完全なコード:
//Get index of next box that fits or -1 if none
int getP(std::vector<Box>& boxes, int n){
double n_w = boxes[n].w;
double n_d = boxes[n].d;
for (int i=n-1; i >= 0; i--){
if (n_w > boxes[i].w && n_d > boxes[i].d)
return i;
}
return -1;
}
//Get highest possible stack.
double stackOfBoxes(std::vector<Box>& boxes, int n, Box* bottom){
if (n == -1)
return 0;
if (bottom == NULL || (bottom->d > boxes[n].d && bottom->w > boxes[n].w))
return max(stackOfBoxes(boxes, n-1, bottom),stackOfBoxes(boxes, getP(boxes,n), &boxes[n])+boxes[n].h);
else
return stackOfBoxes(boxes, n-1, bottom);
}
int main(){
std::vector<Box> boxes = { {3,1,1},{5,2,2},{10,7,7} };
std::stable_sort(boxes.begin(), boxes.end(), sortByW);
std::stable_sort(boxes.begin(), boxes.end(), sortByD);
cout << stackOfBoxes(boxes, 2, NULL) << endl;
}
方法[リンク](http://stackoverflow.com/について質問/ 2329492 /ボックススタッキング問題?noredirect = 1&lq = 1)? – aichao
私が知っているボックス積み重ねの問題では、ボックスは回転できます(いずれの側面もベースとして機能できます)。それはあなたの場合ですか? – Nelfeal
@Nelxiostこれは興味深いケースですが、今は回転させることができないと仮定しましょう。編集された投稿も同様です。 –