【HDU - 1257】最少拦截系统 (标解dp,贪心可过,最长上升子序列类问题)
題干:
某國(guó)為了防御敵國(guó)的導(dǎo)彈襲擊,發(fā)展出一種導(dǎo)彈攔截系統(tǒng).但是這種導(dǎo)彈攔截系統(tǒng)有一個(gè)缺陷:雖然它的第一發(fā)炮彈能夠到達(dá)任意的高度,但是以后每一發(fā)炮彈都不能超過前一發(fā)的高度.某天,雷達(dá)捕捉到敵國(guó)的導(dǎo)彈來襲.由于該系統(tǒng)還在試用階段,所以只有一套系統(tǒng),因此有可能不能攔截所有的導(dǎo)彈.?
怎么辦呢?多搞幾套系統(tǒng)唄!你說說倒蠻容易,成本呢?成本是個(gè)大問題啊.所以俺就到這里來求救了,請(qǐng)幫助計(jì)算一下最少需要多少套攔截系統(tǒng).?
Input
輸入若干組數(shù)據(jù).每組數(shù)據(jù)包括:導(dǎo)彈總個(gè)數(shù)(正整數(shù)),導(dǎo)彈依此飛來的高度(雷達(dá)給出的高度數(shù)據(jù)是不大于30000的正整數(shù),用空格分隔)?
Output
對(duì)應(yīng)每組數(shù)據(jù)輸出攔截所有導(dǎo)彈最少要配備多少套這種導(dǎo)彈攔截系統(tǒng).?
Sample Input
8 389 207 155 300 299 170 158 65Sample Output
2解題報(bào)告:
? ? 這題的標(biāo)解是最長(zhǎng)上升子序列,但是嚴(yán)格證明過程較為復(fù)雜、、、(但是看上去是顯然的?)
AC代碼:(標(biāo)解就是最長(zhǎng)上升子序列的模板)
#include<bits/stdc++.h>using namespace std; int dp[1000000 + 5],a[1000000 + 5]; int n; int main() {while(~scanf("%d",&n)) {for(int i = 1; i<=n; i++) scanf("%d",a+i),dp[i]=1;for(int i = 1; i<=n; i++) {for(int j = 1; j<=i; j++) {if(a[i] > a[j])dp[i] = max(dp[i],dp[j] + 1);}}printf("%d\n",*max_element(dp+1,dp+n+1));}return 0 ;}AC代碼2:(貪心可過、、但是我dp都沒有初始化呀,,不知道是怎么AC的。、)
#include<bits/stdc++.h>using namespace std; int n; int a[1000 + 5]; int dp[1000 + 5]; int top; int main() {while(cin>>n) {top = 0;for(int i = 1; i<=n; i++) {scanf("%d",&a[i]);}for(int i = 1; i<=n; i++) {int minw = 0x3f3f3f3f;int mini = -1;for(int j = 1; j<=top; j++) {if(dp[j] >a[i] && dp[j] <= minw) {minw = dp[j];mini = j;}}if(mini == -1) {dp[++top] = a[i];}else dp[mini] = a[i];}printf("%d\n",top);}return 0 ; }?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【HDU - 1257】最少拦截系统 (标解dp,贪心可过,最长上升子序列类问题)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HDU - 2112】 HDU Tod
- 下一篇: Windows下 Python3.7.0