1. 程式人生 > >nyist oj 79 攔截導彈 (動態規劃基礎題)

nyist oj 79 攔截導彈 (動態規劃基礎題)

某國為了防禦敵國的導彈襲擊,發展中一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國導彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的導彈。

輸入
第一行輸入測試資料組數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
來源

動態規劃基礎題,就是求單調遞減最長子序列,其實就和單調遞增最長子序列一樣的做法,把其中判斷語句改一下就行了,思想是一樣的;

下面是程式碼:

  1. #include <cstdio>
  2. #include <cstring>
  3. constint maxn=25;  
  4. int a[maxn],dp[maxn],m,Max;  
  5. void LICS()  
  6. {  
  7.     memset(dp,0,sizeof(dp));  
  8.     for(int i=0;i<m;i++)  
  9.     {  
  10.         dp[i]=1;  
  11.         for
    (int j=0;j<i;j++)  
  12.             if(a[i]<a[j] && dp[i]<dp[j]+1)//a[i]<a[j]就是單調遞減最長子序列,思想上和遞增的是一樣的
  13.               dp[i]=dp[j]+1;  
  14.     }  
  15.     Max=0;  
  16.     for(int i=0;i<m;i++)  
  17.         if(Max<dp[i])  
  18.         Max=dp[i];  
  19. }  
  20. int main()  
  21. {  
  22.     int n;  
  23.     scanf("%d",&n);  
  24.     while(n--)  
  25.     {  
  26.         scanf("%d",&m);  
  27.         for(int i=0;i<m;i++)  
  28.           scanf("%d",&a[i]);  
  29.         LICS();  
  30.         printf("%d\n",Max);  
  31.     }  
  32.     return 0;  
  33. }