攔截導彈—動態規劃—C++詳解

題目描述:

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

輸入:

第一行輸入測試數據組數N(1<=N<=10)
接下來一行輸入測試數據共有多少個導彈m(1<=m<=20)
接下來輸入導彈依次飛來的高度,所有高度值均是大於0的正整數。

輸出:

輸出最多能攔截的導彈數目

思路:

此題完全類似於求最長上升子序列,只不過本題求的是最長下降子序列,兩題思路完全相同,因此使用動態規劃解決。

具體思路見:最長上升子序列(動態規劃)——C++

代碼如下:

#include<iostream>
using namespace std;
int high[20+1];
int dp[20+1];
int N,m;
int main()
{
	int i,j,maxn;
	cin>>N;
	while(N>0)
	{
		cin>>m;
		dp[1]=1;
		for(i=1;i<=m;++i)
			cin>>high[i];
		for(i=2;i<=m;++i)
		{
			for(j=1;j<i;++j)
			{
				maxn=0;
				if(high[i]<high[j]&&dp[j]>maxn)
				{
					maxn=dp[j];
				}
			}
			dp[i]=maxn+1;
		}
		maxn=0;
		for(i=1;i<=m;++i)
		{
			if(dp[i]>maxn)
				maxn=dp[i];
		}
		cout<<maxn<<endl;
		--N;
	}
	return 0;
}

運行結果:

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