/*
HDU 1257
为了使得使用的拦截系统最少,自然是要考虑使用与当前高度最接近的系统拦截(应该是贪心算法)
*/
#include<stdio.h>
#define INF 0x7ffffff
#define MAXN 10000
int dp[MAXN];//dp[i]代表第i个
int main()
{
int n,x,i,res,flag;
int minh; //minh最小高度差
while(scanf("%d",&n)!=EOF)
{
res=0;// 记录导弹系统套数
while(n--)
{
scanf("%d",&x);
flag=0;//后用作判断 1为次炮弹可被已有系统拦截,0为需一套新系统拦截
minh=INF; //minh记录上一次下降的高度差为一个较大值
for(i=0;i<res;i++)//构造循环与之前导弹系统比较 看是否需新系统
{
if(x<=dp[i]&&minh>dp[i]-x)//若x小于导弹当前拦截的高度且高度差最小
{
minh=dp[i]-x;//将较低的高度差赋给minh
dp[i]=x;
flag=1;//若可被已有系统拦截则不需新系统 flag为1
}
}
if(flag==0)
{
dp[res]=x;
res++;//记录导弹个数
}
}
printf("%d\n",res);
}
return 0;
}
这是贪心算法 得出的是递减序列
也可以用动态规划 从后往前求递增数列 等我看看再说