最少攔截系統-貪心或最長上升子序列
阿新 • • 發佈:2017-08-11
這樣的 cor wrap action pad mem format 貪心算法 string
最少攔截系統
怎麽辦呢?
貪心:
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
某國為了防禦敵國的導彈突擊,發展出一種導彈攔截系統.可是這樣的導彈攔截系統有一個缺陷:盡管它的第一發炮彈可以到達隨意的高度,可是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.因為該系統還在試用階段,所以僅僅有一套系統,因此有可能不能攔截全部的導彈.怎麽辦呢?
多搞幾套系統唄!你說說倒蠻easy,成本呢?
成本是個大問題啊.所以俺就到這裏來求救了,請幫助計算一下最少須要多少套攔截系統.
Input
輸入若幹組數據.每組數據包含:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度數據是不大於30000的正整數,用空格分隔)Output
相應每組數據輸出攔截全部導彈最少要配備多少套這樣的導彈攔截系統.Sample Input
8 389 207 155 300 299 170 158 65
Sample Output
2
子序列:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; //動態分析 /* | | | | | | | | | | | | | | */ //從右到左呈現遞增趨勢 //運用最長上升子序列 int a[3005]; int dp[3005]; int main(){ int n; //freopen("D://imput.txt","r",stdin); while(~scanf("%d",&n)){ for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); int reco=1; for(int i=1;i<=n;i++){ dp[i]=1; for(int j=1;j<i;j++){ if(a[j]<a[i]){ dp[i]=max(dp[i],dp[j]+1); } } reco=max(reco,dp[i]); } printf("%d\n",reco); } return 0; }
貪心:
#include <cstdio> #include <cstring> #include <algorithm> int a[3005],dp[3005],keep[3005]; //貪心算法,每一個階段尋找最優解(正解時間比動態規劃要少空間消耗更大) using namespace std; int main(){ int cur=1,res=0,rec,reco,n; //freopen("D://output.txt","r",stdin); while(~scanf("%d",&n)){ if(n==0)continue; scanf("%d",&a[1]);reco=cur=keep[1]=dp[1]=1; for(int i=2;i<=n;i++){ scanf("%d",&a[i]);rec=0; for(int k=1;k<=cur;k++){ if(a[res=keep[k]]>=a[i]) dp[i]=dp[rec||a[rec]>a[res]?res:rec=res];//將導彈加在最低數的尾部 } if(a[rec]<a[i]) keep[dp[i]=++cur]=i; else keep[dp[i]=dp[rec]]=i; reco=max(reco,dp[i]);//比較,得出最多系統 //printf("[%d]\n",dp[i]); } printf("%d\n",reco); } return 0; }
最少攔截系統-貪心或最長上升子序列