nyist oj 79 攔截導彈 (動態規劃基礎題)
阿新 • • 發佈:2019-02-16
某國為了防禦敵國的導彈襲擊,發展中一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國導彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的導彈。
- 輸入
- 第一行輸入測試資料組數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
- 來源
動態規劃基礎題,就是求單調遞減最長子序列,其實就和單調遞增最長子序列一樣的做法,把其中判斷語句改一下就行了,思想是一樣的;
下面是程式碼:
- #include <cstdio>
- #include <cstring>
- constint maxn=25;
- int a[maxn],dp[maxn],m,Max;
- void LICS()
- {
- memset(dp,0,sizeof(dp));
- for(int i=0;i<m;i++)
- {
- dp[i]=1;
-
for
- if(a[i]<a[j] && dp[i]<dp[j]+1)//a[i]<a[j]就是單調遞減最長子序列,思想上和遞增的是一樣的
- dp[i]=dp[j]+1;
- }
- Max=0;
- for(int i=0;i<m;i++)
- if(Max<dp[i])
- Max=dp[i];
- }
- int main()
- {
- int n;
-
scanf("%d",&n);
- while(n--)
- {
- scanf("%d",&m);
- for(int i=0;i<m;i++)
- scanf("%d",&a[i]);
- LICS();
- printf("%d\n",Max);
- }
- return 0;
- }