动态规划之——又见拦截导弹(nyoj814)
生活随笔
收集整理的這篇文章主要介紹了
动态规划之——又见拦截导弹(nyoj814)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:
又見攔截導彈
時間限制:3000?ms ?|? 內存限制:65535?KB 難度:3 描述大家對攔截導彈那個題目應該比較熟悉了,我再敘述一下題意:某國為了防御敵國的導彈襲擊,新研制出來一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:它的第一發炮彈能夠到達任意的高度,但是以后每一發炮彈都不能超過前一發的高度。突然有一天,雷達捕捉到敵國的導彈來襲。由于該系統存在缺陷,所以如果想把所有的導彈都攔截下來,就要多準備幾套這樣的導彈攔截系統。但是由于該系統成本太高,所以為了降低成本,請你計算一下最少需要多少套攔截系統。
輸入每組數據先輸入一個整數N(N≤3000),代表有N發導彈來襲。接下來有N個數,分別代表依次飛來的導彈的導彈的高度。當N=-1時表示輸入結束。
分析:此題依然是動態規劃問題,可以用動態規劃的思想記錄下每個階段的最優解:有1個導彈來襲需要幾個裝置;有2個導彈來襲,需要幾個裝置;……有n個導彈來襲,需要幾個裝置。這樣有小到大的分析,即得最終問題的最優解。
動態規劃的解法:(40ms)
#include<stdio.h> int main() {int n,i,j,c,a[3000],dp[3000];while(1){scanf("%d",&n);if(n==-1)break;for(i=0;i<n;i++) scanf("%d",&a[i]);dp[0]=a[0]; c=1; for(i=1;i<n;i++){for(j=0;j<c;j++)if(a[i]<=dp[j]){dp[j]=a[i];break;}if(j>=c){dp[j]=a[i]; c++;}}printf("%d\n",c);}return 0; }
#include <stdio.h> int main() {int n,s[3005]={0};while(scanf("%d", &n)&&n !=-1){for(int i=0; i<n; i++)scanf("%d", &s[i]);int cnt=0, k=n,pre;while(k){pre=0;for(int i=n-1; i>=0; i--){if(s[i]>=pre){pre = s[i];s[i] = -1;k--;}}cnt++;}printf("%d\n", cnt);}return 0; }
題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=814 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的动态规划之——又见拦截导弹(nyoj814)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统“烂”怎么办?请看资深专家拆分改造实
- 下一篇: 蚂蚁金服 Service Mesh 大规