题目链接:最少拦截系统
题目大意:给出一穿数字序列,求最少的非递增序列
题目分析:
假设序列为389 207 155 300 299 170 158 65
前三个是非递增的389 207 155,这是一个递减序列,当前最小值为155,dp[0]维护第一个拦截系统的最小值,dp[0]=155;
当输入第四个数时,由于它大于最后一个数155,故要增加个一个拦截系统
现在将300 插入155后面,
dp[1]维护第二个拦截系统最小值,为300,dp[1]=300
后面的数为299 170 158,dp[1]维护的最小值不断更新直至为158
当输入65时,因为155<158,根据贪心的原则,第一个拦截系统首先更新(这样第二个拦截系统可以拦截更大的值),dp[0]变为68
如此重复
#include <stdio.h>
const int maxn=1005;
int dp[maxn];
int n;
int main()
{
//freopen("in.txt","r",stdin);
int x,res,cnt,j,MIN;
while(scanf("%d",&n)!=EOF){
cnt=0;
for(int i=0;i<n;i++){
scanf("%d",&x);
for(j=0;j<cnt;j++){
if(x<=dp[j]){
dp[j]=x;
break;
}
}
if(j==cnt)dp[cnt++]=x;
}
printf("%d\n",cnt);
}
return 0;
}