動態規劃之導彈攔截

題目描述:
某國爲了防禦敵國的導彈襲擊,發展一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國導彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的導彈。
輸入數據:
第一行輸入測試數據組數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;
}

運行結果如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章