ADA19 HW1-6/7
By Arvin Liu
HW 1-6
Controllable
Ghost Leg
1-6 Sub-problems
- inversion的演算法。
- inversion的演算法的複雜度。
- # inversion = |bubble sort|。
-------- - 條件全滿的可控鬼腳圖
- 條件非全滿的可控鬼腳圖
Inversion Pair
1-6-1 求逆序數對
直接使用merge sort的演算法,但是在merge的時候加上以下算法:
// Count inversion pair between A[l~m] and A[m+1~r]
// A[l~m] and A[m+1~r] are sorted due to it's merged before by merge sort.
void counting(int l, int m, int r){
int r_ptr = m+1;
for(int i=l; i<=m; i++){
while(r_ptr <= r && A[r_ptr] < A[i])
r_ptr ++;
ans += r_ptr - m - 1;
}
}
每次算右邊有幾個大於左邊的數字。
因為兩邊都有排序,所以可以直接加idx。
1-6-1 求逆序數對
l_1 <= l_2 <= l_3 ... \\
r_1 <= r_2 <= r_3 ...
如果我們已經知道 l_2 > r_2,
那麼l_3 一定大於r_3
(因為l_3 > l_2),所以不用重算。
1-6-2 求逆序數對時間複雜度
T(n) = 2T(\frac n2) + O(n)
T(n) = O(n \log n)
By Master Theo.
By code:
1-6-3 proof
|Bubble sort| = # Inversion
a_1, a_2, a_3, ... a_i, a_{i+1}, ... a_n
假設序列為:
a_i > a_{i+1}
且
則
I'(A) = I(A)-1
1-6-3 proof
|Bubble sort| = # Inversion
證明恰-=1,且bubble sort會做到沒有inversion pair為止,所以得證
Controllable
Ghost Leg
1-6-4 條件全滿可控鬼腳圖
1
2
3
4
A
B
C
D
Constraints:
{(A->4), (B->2),
(C-> 1), (D->3)}
Step1 : 把數字對回去。
4
2
1
3
Step2 :對對回去的數列做逆序數對。
1-6-4 Why?
4
2
1
3
2
4
1
3
2
1
4
3
2
1
3
4
1
2
3
4
1-6-4 Prove Correctness
每次交換等價於 bubble sort 的 adjacent inversion pair。
最終目標等於沒有inversion pair。
所以需要的平行線 = 需要的交換數 = 逆序數對的數量。
1-6-5 條件非全滿可控鬼腳圖
1
2
3
4
A
B
C
D
Constraints:
{(A->4), (B->2)}
Step1 : 把數字對回去。
4
2
?
?
Step2 : 把沒有條件的從小填到大。
Step 3: 對它做逆序數對。
1-6-5 Prove Correctness
證明變成:
證明將?從小填到大
會造成最小逆序數對。
假設條件:
x_1, x_2, x_3, ?_4, x_5, ?_6, ?_7
我們證明?有逆序數對保證不是最佳解來證明。
1-6-5 Why?
我們隨便抓x_i, ?_j, ?_k。
如果i < j&k 或 i> j&k則不變,
但如果是 j < i < k:
x_1, x_2, x_3, ?_4, x_5, ?_6, ?_7
1-6-5 Why?
因為當?_j 和 ?_k是逆序,
則交換一定會比較好。
所以?必須沒有逆序數 ->
也就是?必須是個遞增序列 ->
所以從小填到大才會讓逆序數對最小。
HW 1-7
Folding Blocks
Case: Single Block
1-7-1 證明單block有解
\log_{2} \frac Nk \\
\frac {i-1}{k}
is non-negative integer. 且
is non-negative integer
否則我們在 1-7-2 有個構造法。
我們會在接下來證明i-1必須是k的倍數。
1-7-2 推單block步驟
let N=總長, i=位置, k=長度
如果 k=N, 表示已解完。
k!=N,表示最後一次一定要翻N/2。
此時如果右半邊全空,就表示最後一步必是right,反之亦然,並用divide and conquer(?) 解剩下的半邊。
->所以如果不能翻(block卡在中間),表示無解
1-7-2 回證 1-7-1
如果不能翻(block卡在中間),且log2 (N/k)右為正整數,會是什麼狀況?
就是(i-1) 不是k的倍數。因為如果是,它就不會卡在中間。(不會有N/2卡在i,i+k中間)
又因為做Divide and conquer的時候,
i的變化只會不變或是(i - N/2)
所以遞迴前的i % k並不會變,
得 i-1 % k ==0才有解。
* N/2 是 k的倍數。
1-7-3 單格翻完狀態O(d1+d2)
如果將board整個/k,
因為1-7-1證明只要長度對,那麼保證有解,所以翻x次至少就有2^x種狀態
1-7-3 單格翻完狀態O(d1+d2)
\sum ^{ log_2(d_1+d_2) }_{x=0} 2^x = 2^{log_2(d_1+d_2) + 1 } - 1 = 2 \times (d_1+d_2) - 1 = O(d_1 + d_2)
最多就翻log2(d1+d2) 次-> 所有狀態:
Case: Multi Blocks
1-7-4 DP
狀態定義:
DP[x] = 是否可以完成1~x的board
Initial State:
DP[0] = True
ans : DP[n]
1-7-4 DP
for now_B in B:
for (x,y) in possibilities_of_unfold(now_B):
if DP[x-1] is True:
DP[y] = Ture
對於每個Block有可能翻完的狀態設為(x,y),
那麼如果x-1是True,就表示y也一定是True。
1-7-5 DP性質
最佳子結構:
對於所有要遞迴問題DP(x)中,我們選擇了最佳解。(optimal)
重複子問題:
我們不會重複運算DP(x),因為被紀錄起來/我們是用bottom-up的方法。
1-7-6 DP複雜度
d_1
d_2
d_3
...
2(d_1+d_2)-1
2(d_2+d_3)-1
...
\}
4 \sum_{i=1}^n d_i - 2d_1 - 2d_n - n = O(N)
\Omega(N) \text{Tirivial. (最多要掃N次)}
ADA19 HW1-6/7
By Arvin Liu
ADA19 HW1-6/7
- 1,025