2020演算法設計競賽 C 漢諾塔

2022-06-02 07:48:09 字數 1154 閱讀 7515

將木板按照xi從小到大排序,將這時的yi數列記為zi數列,則問題變成將zi劃分為盡可能少的若干組上公升子串行。

根據dilworth定理,最小組數等於zi的最長下降子串行長度。

要求最長下降子串行的長度,我們有一種經典的二分優化dp的方法,在這裡不再詳述。 借助這種做法我們能給出一種構造方法,在求出最小組數的同時得出方案。

將狀態陣列的每個位置變為棧,用入棧操作代替修改元素操作,即可在求出組數的同時,用這些棧來完成對數列的劃分。

在用這種方法的時候,我們假定x序列已經從小到大排,然後y序列為:6 3 2 5 4 7 1

那麼得出的序列劃分就為:1 2 3 2 3 1 4

我們將6作為第乙個區間中的數,3比他小,所謂dp值為2,作為第二個區間,2比3還小,所以第三個區間,而5比6小,所以第二個區間

這裡肯定能滿足,已經在第二區間的數肯定小於剛加入區間的數,因為如果比他大的話,那麼就長度+1,不會加在這個區間了。

然後上文:根據dilworth定理,最小組數等於zi的最長下降子串行長度。

**如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;

8const

int n = 100050;9

10struct

node

15}a[n];

16int

n, m, ot[n], s[n];

1718

intmain()

1927 sort(a + 1, a + n + 1

);28

for(i = 1; i <= n; i ++)

37 s[lb] =a[i].y;

38if(lb > m) m =lb;

39 ot[a[i].loc] =lb;40}

41 printf("

%d\n

", m);

42for(i = 1; i <= n; i ++)

43 printf("

%d "

, ot[i]);

4445

return0;

46 }

漢諾塔演算法

最簡步驟 2的n次冪 1 為了實現 n個盤從 借助c 從a 移動到 b 思路如下 首先考慮極限當只有乙個盤的時候 只要 盤直接從 a b即可 那麼當有2個盤的時候就只要先把1號盤從a c 然後 把2號盤 a b 再 把 2好盤從 c b 那麼當有n個盤的時候你只要先把 n 1個 盤 借助 b 移動到...

漢諾塔演算法

解法 如果柱子標為abc,要由a搬至c,在只有乙個盤子時,就將它直接搬至c,當有兩個盤子,就將b當作輔助柱。如果 盤數超過兩個,將第三個以下的盤子遮起來,就很簡單了,每次處理兩個盤子,也就是 a b,a c,b c這三個 步驟,而被遮住的部分,其實就是進入程式的遞迴處理。事實上,若有n個盤子,則先移...

漢諾塔演算法

乙個印度傳說 在乙個神廟裡有有乙個漢諾塔,就是乙個銅板上插著3個寶石針,其中一根針從上到下的穿著由小到大的銅片64片,僧人們一次只能移動乙個銅片,並且不論移到哪個針上,必須保持小片在大片上面。僧侶們預言,當所有的銅片都從穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消亡。當然,這只是個傳說,...