ADA19 HW1-6/7

By Arvin Liu

HW 1-6
Controllable

Ghost Leg

1-6 Sub-problems

  1.  inversion的演算法。
  2.  inversion的演算法的複雜度。
  3.  # inversion = |bubble sort|。
    --------
  4.  條件全滿的可控鬼腳圖
  5.  條件非全滿的可控鬼腳圖

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

  • 607