【HDU - 1257】最少拦截系统 (标解dp,贪心可过,最长上升子序列类问题)
生活随笔
收集整理的這篇文章主要介紹了
【HDU - 1257】最少拦截系统 (标解dp,贪心可过,最长上升子序列类问题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
某國為了防御敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以后每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由于該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈.?
怎么辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這里來求救了,請幫助計算一下最少需要多少套攔截系統.?
Input
輸入若干組數據.每組數據包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度數據是不大于30000的正整數,用空格分隔)?
Output
對應每組數據輸出攔截所有導彈最少要配備多少套這種導彈攔截系統.?
Sample Input
8 389 207 155 300 299 170 158 65Sample Output
2解題報告:
? ? 這題的標解是最長上升子序列,但是嚴格證明過程較為復雜、、、(但是看上去是顯然的?)
AC代碼:(標解就是最長上升子序列的模板)
#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 ; }?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【HDU - 1257】最少拦截系统 (标解dp,贪心可过,最长上升子序列类问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HDU - 2112】 HDU Tod
- 下一篇: 【POJ - 3468 】 A Simp