hdu 1257 dp(最长下降子序列)

View Code
//hdu 1257  dp(最长下降子序列的长度)



//题意是要求最少要几套拦截系统,没套系统拦截的后一个导弹

//要比前一个低,导弹按顺序来,讨论每个导弹时要依次看

//比 所拥有的哪个系统 的最低高度低最少的,则让这个系统拦截

//若所拥有的系统中 的最低高度都比该导弹低,则要再建一套系统



#include <stdio.h>

#include <string.h>



#define N 10005



int s[N], dp[N];



int main()

{

    int n;

    while(scanf("%d", &n) != EOF)

    {

        for(int i = 0; i < n; ++i)

        {

            scanf("%d", &s[i]);

            dp[i] = 1;

        }

        int max = 0;

        for(int i = 0; i < n; ++i)  //拦截第i 个导弹

        {

            for(int j = i - 1; j >= 0; --j)

            {   //若第j 个导弹比第 i 个导弹低,且且拦截第 j

                //个导弹所需的系统数 再建一个拦截i,比拦截i所需的

                //系统数多,则需要建这个,因为 拦截第j 个需要的系统数

                //比 i 多,导弹i 又在j 后才来,这是不可能的

                if(s[i] > s[j] && dp[i] < dp[j] + 1)

                {

                    dp[i] = dp[j] + 1;

                    if(max < dp[i])

                        max = dp[i];

                }

            }

        }

        printf("%d\n", max);

    }

    return 0;

}

 

 

你可能感兴趣的:(HDU)