將木板按照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 67using
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片,僧人們一次只能移動乙個銅片,並且不論移到哪個針上,必須保持小片在大片上面。僧侶們預言,當所有的銅片都從穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消亡。當然,這只是個傳說,...