HDU 1257 最少拦截系统(下降子序列的条数)

题目地址:点击打开链接

思路:和HDU 1051差不多,只不过那道题事先得排序,这道题,直接动态规划就可以解决,不用用贪心,很多人会误认为每个导弹应该选能拦截它的系统中最低的那个,这样可以减少不必要的下降,其实刚开始开一个系统即可,随便降,遇到导弹拦截不住,再开一个就行,开系统的条件是之前所有的系统都拦截不住,每个系统都是随便降,举个简单的例子,1551,3,1550,其实没必要拦截1551,1550的是一个系统,拦截3的是一个系统,写点长的例子自己理解吧,总而言之,这道题就是求,下降子序列的条数

超时代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[10000],visit[10000];

int main()
{
    int n,i,k,max1,sum;
    while(scanf("%d",&n) != EOF)
    {
        memset(visit,0,sizeof(visit));
        k = 0;
        sum = 0;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        while(k < n)
        {
            max1 = 4000;
            for(i=0; i<n; i++)
            {
                if(!visit[i] && a[i] <= max1)
                {
                    max1 = a[i];
                    visit[i] = 1;
                    k++;
                }
            }
            sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}
AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[30000],b[30000];

int main()
{
    int n,i,j,k;
    while(scanf("%d",&n) != EOF)
    {
        k = 0;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0; i<n; i++)
        {
            for(j=0; j<k; j++)
            {
                if(a[i] < b[j])
                {
                    b[j] = a[i];//b数组保存的是每条系统目前的最低值
                    break;
                }
            }
            if(j == k)
            {
                b[k] = a[i];
                k++;
            }
        }
        printf("%d\n",k);
    }
    return 0;
}

大神地址: 点击打开链接

你可能感兴趣的:(HDU 1257 最少拦截系统(下降子序列的条数))