如果輸入按順序排列,並且假設座位數總是達到12
,那麼在每個州(乘客組)都可以乘坐座位的方式只有2^12
。您可以使用它來減少暴力/記憶解決方案的狀態數量。
僞代碼:
IsSeatingPossible(mask, passengers) =
if (no more passengers) return true
return IsSeatingPossible =
new_mask = mask + brute force on passenger constraints
if any IsSeatingPossible(new_mask,
passengers - just processed passengers)
更多說明:
掩模基本上是12個布爾陣列,說明seat_i是否採取對於每個i(你可以轉換2D (x,y)
- > 1D (x)
容易)。然後你重複可能性。如果這個乘客組(A_1, A_2, .., A_k)
每個都有一個座位,並且其餘乘客有座位,則可以有一個完整的座位。
因此,傳入英文的面具就是坐席。假設您坐在(x_1, x_2, .., x_k)
的座位(A_1, A_2, .., A_k)
。有許多乘客可以乘坐的子集 - 以N choose k
爲界,在這種情況下,它很小。這是你蠻橫的一部分。給定一個特定的(x_1, x_2, .., x_k)
,這個座位是可能的,如果(x_1, x_2, .., x_k)
與當前面罩沒有重疊(基本上沒有衝突座位),並且可以處理其餘的乘客請求,因爲新面罩只是設置添加當前的面具和(x_1, x_2, .., x_k)
。 (所採取的新套座位。)
這可能也可能不夠快。整潔的事情注意到,除了注意哪些座位被採取以及處理了哪些乘客之外,針對某個子問題的解決方案是相同的。因此,您可以通過使用memoization來簡化這個過程。這產生了一個O(N 2^N)
空間解決方案。
該掩碼最好使用位掩碼來實現,特別是對於N = 12
,因此名稱。對於乘客請求列表,您可能需要跟蹤哪個索引。
男人,如果只有我不在工作。這聽起來像一個有趣的問題。乘客坐下後可以移動嗎? – ChaosPandion 2010-03-12 18:23:13
Oh jeez,我的TI-83在哪裏... – dclowd9901 2010-03-12 18:24:05
@mmyers - 我正在進行相同的編輯。 :) – ChaosPandion 2010-03-12 18:26:02