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