牛客OI-旅行青蛙

时间限制 1000ms 空间限制

262144K

题目:
一只青蛙出去旅游,因为中国有一句古话说的好:“由简入奢易,由奢入俭难”,所以这只青蛙当看的当前景点比前面看过的景点差的时候,青蛙就会说“不开心”为了避免这只青蛙说“不开心”,并且使青蛙看的景点尽量的多,所以他请你帮忙给他安排一条线路,使青蛙可以看到尽量多的景点,并且不走回头路。

输入:

第一行为一个整数n,表示景点的数量
接下来n行,每行1个整数,分别表示第i个景点的质量

输出:

一个整数,表示青蛙最多可以看到几个景点

备注:
景点质量为1到n+23的整数
10<=n<23 10%

23<=n<233 30%

233<=n<2333 60%

2333<=n<23333 100%

样例输入:

10

3

18

7

14

10

12

23

30

16

24

样例输出:

6

题意:

一直青蛙旅行,他要去n个地点,每个地点有个有趣值,他去这个地点一定不能比他去过的地点的有趣点低,让你规定一条路线,使得他能尽可能到达最多的地点。

思路:

最长递增子序列模板题。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define ONF 0xc0c0c0c0
using namespace std;
typedef long long LL;
int main()
{
    int a[30000],n,dp[30000];
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        dp[i]=1;
    }
    int Max;
    for(int i=1;i<=n;i++)
    {
        Max=0;
        for(int j=1;j<i;j++)
        {
            if(a[j]<=a[i])
            {
                Max=max(Max,dp[j]);
            }
        }
        dp[i]=Max+1;
    }
    int s=-1;
    for(int i=1;i<=n;i++)
    {
        s=max(s,dp[i]);
    }
    cout<<s<<endl;
}

注意点:求最长递增子序列有两种方法,第一种是用一个数组存有序的元素,然后两个数组求最长公共子序列,第二种是dp动态规划,显然在这里第一种方法行不通,要用第一种方法就要开一个二维dp,这里显然是开不了的,所以只有用第二种方法了。

posted @ 2018-08-30 00:00  Leozi  阅读(211)  评论(0编辑  收藏  举报