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