攔截飛彈簡單版 線性dp

2022-02-01 19:47:03 字數 1370 閱讀 8252

題目描述

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

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

樣例樣例輸入

389 207 155 300 299 170 158 65
樣例輸出

6

2

分析:本題共兩問:第一問可以等價為求最大不上公升子串行。這樣問題就簡單了。

首先定義乙個i和j。j想對於i更新較快,j<=i。

定義f[i]表示從1到i的最大非上公升子串行長度,a[i]為i的高度。如果a[j]>a[i]那麼f[i]就可能需要更新所以f[i]=max(f[i],f[j]+1);

1

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

6 maxx=max(maxx,f[i]);

7 }

核心**

第二問我一開始想的是用多次求最長不上公升子串行,但這個想法顯然是錯的比如「7 5 4 1 6 3 2」用多次求最長不上公升序列所有為」7 5 4 3 2」,

」1」,」6」共3套系統;但其實只要2套,分別為:」7 5 4 1」與」6 3 2」。

正確做法(還有一種做法,效率(n2),超時了,就不說了)第二問的,我們需要用到dilworth定理:最少鏈劃分=最長反鏈長度

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

mixn=max(mixn,g[i]);

}

核心**

#includeusing

namespace

std;

const

int l=200+100

; int n=1,h[l],a[l],f[l],g[l],maxx=-11111111,mixn=-11111111

; int

main()

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

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

mixn=max(mixn,g[i]);

} printf(

"%d\n%d\n

",maxx,mixn);

return0;

}

完整**

攔截飛彈(DP)

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

DP 攔截飛彈

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

NOI 8780 攔截飛彈 線性dp

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