某國爲了防禦敵國的導彈襲擊,發展一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國導彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的導彈。
輸入數據:
第一行輸入測試數據組數N(1<=N<=10)
接下來一行輸入這組測試數據共有多少個導彈m(1<=m<=20)
接下來行輸入導彈依次飛來的高度,所有高度值均是大於0的正整數。
輸出結果:
輸出最多能攔截的導彈數目及所攔截導彈的序列。
代碼如下:
//導彈攔截
#include <iostream>
using namespace std;
int main()
{
int i,j,t,n;
int x[30],d[30]; //x數組存放的是導彈的高度,d數組存放的是第i枚導彈,導彈系統還能攔截多少枚導彈(包含第i枚導彈)
int xh=0; //xh記錄攔截第一枚導彈的序號
cin>>t;
while(t--)
{
int dmax=0; //dmax爲導彈攔截系統所能攔截的的導彈的數目
cin>>n;
for(i=0;i<n;i++)
{
cin>>x[i];
d[i]=1; //將d數組賦初值爲1
}
//動態規劃遞歸方程算法,遞歸實現,採用從後面向前循環。兩層for循環,從倒數第二個數據開始循環。
for(i=n-2;i>=0;i--) //外層循環實現遞推
for(j=i+1;j<n;j++) //內層循環實現回溯
if(x[i]>x[j]&&d[i]<d[j]+1)
{
d[i]=d[j]+1;
}
for(i=0;i<n;i++) //找出攔截最大個數
if(d[i]>dmax)
{
dmax=d[i];
xh=i;
}
cout<<dmax<<endl;
cout<<x[xh]<<",";
for(j=xh+1;j<n;j++)
if(x[j]<x[xh]&&d[xh]==d[j]+1)
{
cout<<x[j]<<",";
xh=j;
}
cout<<endl;
}
return 0;
}
運行結果如下: