dilworth定理 屬性排序(木棍加工)

2022-05-18 05:17:59 字數 1456 閱讀 9221

一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的:

第一根棍子的準備時間為1分鐘;

如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l>=li,w>=wi,這個棍子就不需要準備時間,否則需要1分鐘的準備時間;

計算處理完n根棍子所需要的最短準備時間。比如,你有5根棍子,長度和寬度分別為(4, 9),(5, 2),(2, 1),(3, 5),(1, 4),最短準備時間為2(按(4, 9)、(3, 5)、(1, 4)、(5, 2)、(2, 1)的次序進行加工)。

輸入格式:

第一行是乙個整數n(n<=5000),第2行是2n個整數,分別是l1,w1,l2,w2,…,ln,wn。l和w的值均不超過10000,相鄰兩數之間用空格分開。

輸出格式:

僅一行,乙個整數,所需要的最短準備時間。

輸入樣例#1: 

5

4 9 5 2 2 1 3 5 1 4

輸出樣例#1:

2

拿到這道題,第一思路:暴力,用騷操作優化一下,說不定會快的飛起呢!!!

但實際上,只要稍微一思考,就會發現這就是一道赤裸裸的dp啊。

我們進一步分析,會發現,要同時滿足l0>l1,w0>w1,就說明它有兩種屬性,傻子都看的出這題的貪心就是使序列滿足兩種屬性的同時,盡可能多的

找出最長上公升子串行,對不對?

同時又由於dilworth定理我們知道,同乙個序列裡,最長上公升子串行的個數就等於最長不上公升子串行的長度,所以我們又把問題裝換成了求最長不上公升子串行

我相信大家一定都會o(nlogn)演算法來求,對不對?

所以我在此不再贅述。

但是還有乙個問題,如何處理雙重屬性的問題,我們有乙個通用的方法,就是將其中的一重屬性排序,來求另一重的目標序列,這個東西啊,我講也講不清楚

自己多體會體會,再用一些騷操作,我相信你會明白的,對不對?

諾,下面是**(我用stl寫的)

#include#include

#include

#include

#define maxn 5000+5

using

namespace

std;

intn,f[maxn];

struct

stacks[maxn];

bool cmp(const stack &a,const stack &b)

intmain()

else

}printf("%d

",len);

//長度即使答案。

return0;

}

我還是很蒟蒻的,所以如果有任何漏洞的話,還請讀者大老爺們指出qaq

謝謝大家!……!

Dilworth定理證明

設偏序集s。s能劃分成的最少的全序集的個數為k,s的最大反鏈的元素個數為m。1.先證明k m。設反鏈a 假設k2.再證明k m。用第二數學歸納法。設全序集s中有m個元素。1 當m 0和m 1時,對於命題結論顯然成立。2 假設m設x為s中的乙個極大元。考慮s s 這個偏序集。由於 s 那麼對於任意乙個...

狄爾沃斯定理(Dilworth定理)

狄爾沃斯定理 dilworth s theorem 亦稱偏序集分解定理,是關於偏序集的極大極小的定理,該定理斷言 對於任意有限偏序集,其最大反鏈中元素的數目必等於最小鏈劃分中鏈的數目。此定理的對偶形式亦真,它斷言 對於任意有限偏序集,其最長鏈中元素的數目必等於其最小反鏈劃分中反鏈的數目,由偏序集p按...

飛彈攔截與Dilworth定理

這兩天被dilworth 鏈和反鏈搞到頭昏腦脹,終於有點眉目,現在來總結一下。dilworth定理說的是 對於乙個偏序集,其最少鏈劃分數等於其最長反鏈的長度。dilworth定理的對偶定理說的是 對於乙個偏序集,其最少反鏈劃分數等於其最長鏈的長度。dilworth定理先不證,有空再不上來,其對偶定理...