sicily 1685. Missile

// 题意:有n个导弹,假若能摧毁4个导弹,则高度的要求:后面摧毁的导弹坐标要靠后
// 而且第2个导弹比第1个导弹低,第3个导弹比第2个导弹高,第4个导弹比第3个导弹低
// 即是偶数位的要比前面的低,而奇数位的要比前面的高

#include<iostream> //DP, 最小不单调子序列, O(n^2)的时间复杂度,n<=1000,数据规模较小
using namespace std;

int n,h[1002],ans[1002][2];
// ans[i][0]表示以第i个数作为结束摧毁导弹的最大数量,此时第i个数在顺序上是偶,而ans[i][1]则表示第i个数在顺序上是奇
int main()

{
while(cin>>n&&n)
{
for(int i=1;i<=n;++i)
cin>>h[i];
for(int i=1;i<=n;++i)
{
ans[i][0]=0;
ans[i][1]=1; //显然任意一个本身都可以作为第一个"the odd missile to destroy",所以ans[i][1]=1
}

int MAX;
for(int i=2;i<=n;++i)
{

// 第i个数在顺序上是偶
MAX=0;

for(int j=1;j<i;++j)
{
if(h[j]>h[i]&&ans[j][1]>MAX)
MAX=ans[j][1];
}
if(MAX>0)
ans[i][0]=MAX+1;


// 第i个数在顺序上是奇
MAX=0;

for(int j=1;j<i;++j)
{
if(h[j]<h[i]&&ans[j][0]>MAX)
MAX=ans[j][0];
}
if(MAX>0)
ans[i][1]=MAX+1;

}
int res=0;
for(int i=1;i<=n;++i)
res=max(res,max(ans[i][0],ans[i][1]));
cout<<res<<endl;
}
return 0;
}

posted on 2011-07-21 17:01  sysu_mjc  阅读(233)  评论(0编辑  收藏  举报

导航