题意:一种导弹拦截系统,有个缺陷,第一发炮弹能达到任意高度,但以后的炮弹都要比上一发低,问某政府只能买一套系统,最多能拦截几发炮弹。
思路:导弹拦截是经典动态规划题,这个问题其实可以看做是最长递减序列,每一发炮弹都要低于前一发的高度。这里用一维写的,一个道理,
if( a[j] > a[i]) dp[i] = max(dp[i],dp[j]+1)也可以看做最长上升序列把判断条件反过来而已。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[200],n,T,dp[20200],ans;
int Max(int a,int b){return a>b?a:b;}
void input()
{
cin >> n;
for(int i = 0 ; i < n ; i++)
cin >> a[i];
memset(dp,0,sizeof(dp));
}
void solve()
{
ans = 0;
for(int i = 0 ; i < n ; i++)
{
dp[i] = 1;
for(int j = 0 ; j < i ; j++)
{
if(a[j] > a[i])
dp[i] = Max(dp[i],dp[j]+1);
}
ans = Max(dp[i],ans);
}
cout << ans << endl;
}
int main()
{
#ifdef H_R
freopen("in.txt","r",stdin);
#endif // H_R
while(cin >> T)
{
while(T--)
{
input();
solve();
}
}
return 0;
}