Dilworth定理的應用和最長??序列

2022-05-21 21:12:11 字數 2328 閱讀 3706

有這麼乙個題目 飛彈攔截

問題描述:某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。

輸入飛彈依次飛來的高度(雷達給出的高度資料是≤50000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

簡而言之,這個題目就是要求出最長的不遞增序列和不遞增序列的個數。

dilworth定理 (???什麼東西) ,不遞增序列的個數等於遞增序列的最大長度

所以我們只需要求出不遞增序列的最大長度和遞增序列的最大長度。(問題是這我也不會啊 )

那麼我們就要學習一下怎麼求最大??序列的長度。

第一問很明顯是求最長不上公升子串行,利用dp的思想,我們設f[i]為以第i個數為開頭的最長不上公升子串行的長度,然後可以得到這樣一段程式

for(int i=n;i>=1;i--)

ans1=max(ans1,f[i]);//更新ans1

}

在樸素n^2演算法中,用f[i]儲存以i結尾的最長不上公升子串行長度,如樣例

i 1 2 3 4 5 6 7 8

a 389 207 155 300 299 170 158 65

f 1 2 3 2 3 4 5 6

發現當f的值相同時,越後面的飛彈高度越高

用d[i]維護f值為i的最後乙個飛彈的位置,t記錄當前已經求出最長不公升子串行長度

遞推求f時列舉a[d[t]],a[d[t-1]],。。。,a[d[1]]是否≥當前求的飛彈高度,是就更新f

while(~scanf("%d",&a[++n]));//讀入資料方法

n--;//n是飛彈數,由於某些原因要--

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

t=max(t,f[i]);

d[f[i]]=i;//簡單的維護過程

ans=max(ans,f[i]);

}

(即一套系統最多攔截數)(終於到二了)

1.實現方式

首先我們需要乙個陣列a,儲存從第1個到第n個飛彈的高度

然後乙個陣列d(其實是個棧),儲存不上公升序列

把a中的每個元素挨個加到d裡面:

(a中第i個元素為a[i],d長度為len,d中最後乙個(也是最小的乙個)為d[len])

如果a[i] <= d[len],說明a[i]可以接在d後面(而整個d還是有序的),那就簡單粗暴地把a[i]丟進d:

d[ ++len ] = a[i]
如果a[i] > d[len],說明a[i]接不上

但是我們發揚瞎搞精神:接的上要接,接不上創造條件也要接!

強行把a[i]塞進去:

在d中找到第乙個小於a[i]的數,把它踹了,用a[i]代替它!(為什麼正確在下面)

2.為什麼正確

顯然成立

如果y在末尾,由於y < a[i],所以y後面能接的不如a[i]多,y讓位給a[i]可以讓序列更長

如果y不在末尾,那y有生之年都不會再被用到了,直接踹了y就行,y咋樣,who care?

3方法增加二分 查詢

參考:飛彈攔截 題解

p3902 遞增

#include#define intn long long

#include#include#include#include#include#include#define _0for(i, a) for(int i = 0; i < (a); ++i)

#define _1for(i, a) for(int i = 1; i <=(a); ++i)

#define lowbit(x) ((x)&(-x))

#define debug(x) \

(void)(cerr << "l" << __line__\

<< " : " << #x << " = " \

<< (x) << endl )

using namespace std;

int dp1[200];

int dp2[200];

main(void)

a[n+1]=0;

for(int i=1;i<=n;i++)//當前狀態

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

cout<}

Pascal定理的最簡證明

pascal定理 在任意圓錐曲線上由任意6個點1 2 3 4 5 6所構成的內接六邊形123456的三組對邊12與45,23與56,34與61分別形成的三個交點l m n必在一直線上。定理的證明 我們對園進行證明,並設123456為乙個正六邊形。這時對邊均相互平行,即12 45,23 56,34 6...

同餘模定理的應用

一 公式 同餘模定理 a b mod a mod b mod mod a b mod a mod b mod mod 二 應用 求s description s n n 5 求s n 除以3的餘數 input 每行輸入乙個整數n,0 n 1000000 注意n的範圍,int long long in...

初等數論初步 費馬小定理和尤拉定理的應用

例1.求 13 2004 除以17的餘數.分析 遇到有關帶指數的被除數的問題,我們首先考慮運用同餘 互素以及費馬小定理或尤拉定理,降次使被除數變小,進而求出餘數。容易直到17為素數,且 13,17 1,由費馬小定理可知 13 13 equiv 1 mod 17 又因為 2004 16 125 4 所...