简单的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;
}   

转载于:https://www.cnblogs.com/fzuljz/p/5711131.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值