最長下降子數列/攔截導彈
阿新 • • 發佈:2018-11-11
本人演算法小白,大佬繞路。
簡述題意:
攔截導彈
描述
某國為了防禦敵國的導彈襲擊,發展中一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國導彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的導
輸入
第一行輸入測試資料組數N(1<=N<=10)
接下來一行輸入這組測試資料共有多少個導彈m(1<=m<=20)
接下來行輸入導彈依次飛來的高度,所有高度值均是大於0的正整數。
輸出
輸出最多能攔截的導彈數目
樣例輸入
2 8 389 207 155 300 299 170 158 65 3 88 34 65
樣例輸出
6
2
彈。
本以為是一道高深的動態規劃,查了查,最好的解決方案就是採用最長下降子數列;
思路:採用計數陣列d[n],當字元陣列a[i]>a[j];d[i]=max(d[i],d[j+1]);
不廢話了,直接上程式碼:
#include <cstdio> #include <algorithm> int fun(const int *a,int n) { int r=0,d[20]; for(int i=0;i<n;i++) { d[i]=1; for(int j=0;j<i;j++) { if(a[j]>a[i]) d[i]=max(d[i],d[j]+1); } r=max(r,d[i]); } return r; } int main() { int a[20],t; scanf("%d",&t); while(t--) { fflush(stdin); int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); printf(%d",fun(a,n)); } return 0; }