動態規劃之攔截導彈

---恢復內容開始---java

攔截導彈 

描述

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

輸入
第一行輸入測試數據組數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.定義兩個長度同樣的數組,一個數組a用來存儲敵方發射過來的導彈,一個數組b存儲我方攔截的導彈的個數,且b數組中初始值爲1。
2.在數組a中從數組的最後一位往前面的開始比較,若是a[i]>a[i+1],則a[i]能夠攔截a[i+1],此刻b[i]的值爲2.
3.具體的動態規劃過程看下圖:
每一數都與後面的一個數相比,若是大於,說明攔截不到該導彈,就繼續與下一個數相比。若是小於則能夠攔截到該導彈。
代碼以下:
package othermethod;

import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(new BufferedInputStream(System.in));
        int t=sc.nextInt();//t組測試數據
        int a[]=new int[22];
        int b[]=new int[22];
        while(t-->0){
            int n=sc.nextInt();
            for(int i=0;i<n;i++)
                a[i]=sc.nextInt();
            for(int i=0;i<n;i++)
                b[i]=1;
            for(int i=n-2;i>=0;i--){
                int max=0;
                for(int j=i+1;j<n;j++){
                    if(a[i]>a[j])
                        if(b[j]>max)
                            //尋找最大的導彈攔截的個數
                            max=b[j];
                }
                b[i]+=max;
               
            }
            int max=0;
            for(int i=0;i<n;i++)
                if(b[i]>max)
                    max=b[i];
            System.out.println(max);
        }
    }
}

運行結果:測試

 

---恢復內容結束---spa

相關文章
相關標籤/搜索