L J Z
0 1

简单的dp加贪心

题目链接:传送门

这个题目让我纠结了好久,之后恍然大悟是求最长的递减序列,并加上贪心的算法,如果有大于两个的发射系统,应该判断使导弹的高度与此时个个发射系统的高度比较,选取高度差最小的去执行这次的拦截,这样才能保证发射系统的数量最小

代码:



#include<stdio.h>
#define INF 0x7ffffff
#define MAXN 10000
int dp[MAXN];//dp[i]代表第i个导弹当前拦截的高度
int main()
{
    int n,x,i,res,flag;
    int min;
    while(scanf("%d",&n)!=EOF)
    {
        res=0;
        while(n--)
        {
            scanf("%d",&x);
            flag=0;
            min=INF;
            int tempi;            
            for(i=0;i<res;i++)
            {                                //其中min>dp[i]-x的条件是选取差值较小的去打 
                if(x<=dp[i]&&min>dp[i]-x)   //寻找最长的序列,更新 
                {
                    min=dp[i]-x;
                    //dp[i]=x;
                    tempi=i;
                    flag=1;
                }    
            }
            if(flag==0)
            {
                dp[res]=x;
                res++;
            }        
            else dp[tempi]=x;
        }
        printf("%d\n",res);    
    }    
    return 0;
}   

posted @ 2016-07-27 14:48  小小钊  阅读(201)  评论(0编辑  收藏  举报