【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛 最长上升子序列

原创 2016年08月29日 09:05:02

Description

Farmer John养了N(1 <= N <= 5,000)头奶牛,每头牛都有一个不超过32位二进制数的正整数编号。FJ希望奶牛们在进食前,能按编号从小到大的顺序排好队,但奶牛们从不听他的话。为了让奶牛们养成这个习惯,每次开饭时,FJ从奶牛中顺序地挑出一些,这些奶牛的编号必须按挑出的顺序递增。然后FJ让被挑出的奶牛们吃饭——其他奶牛就只能饿肚子了。 现在,你得到了这一次开饭前队伍中从前到后所有奶牛的编号。奶牛们想请你计算一下,按照FJ的规定,最多有多少头奶牛能吃上饭? 比如说,有11头奶牛按以下顺序排好了队(数字代表奶牛的编号) 2 5 18 3 4 7 10 9 11 8 15 对于这个队列,最多可以让7头奶牛吃上饭,她们的编号分别为2,3,4,7,10,11,15。队列2,5,3,10,15是不合法的,因为第3头奶牛的编号(3)小于她前面一头奶牛的编号(5)。

Input

* 第1行: 一个整数,N * 第2..?行: 除了最后一行,每一行都包含恰好20个用空格隔开的整数,依次表 示队伍中从前到后的奶牛的编号。如果N不能整除20,那么最后一 行包含的数字不到20个

Output

* 第1行: 输出按照FJ的规定,最多可以挑出的奶牛的数目

Sample Input

11
2 5 18 3 4 7 10 9 11 8 15

Sample Output

7

HINT

Source

 题解:

  这题……直接dp最长上升子序列。。无聊的我交了单调栈+贪心的nlog……

      O(n^2):

     

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=5001;
int a[MAXN],dp[MAXN];
int main(int argc, char *argv[])
{
	int n,m,i,j;
	int ans=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		for(j=0;j<i;j++)
		if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);
		ans=max(ans,dp[i]);
	}
	printf("%d\n",ans);
	return 0;
}


O(nlogn):

 

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=5001;
int s[MAXN];
int main(int argc, char *argv[])
{
    int n,i,x,l,r,mid;
    int top=0;
    s[0]=-1;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x>s[top]) s[++top]=x;
        else
        {
            l=0,r=top;
            while(l<r)
            {
                mid=(l+r)/2;
                if(x<=s[mid]) r=mid;
                else l=mid+1;
            }
            s[l]=x;
        }
    }
    printf("%d\n",top);
    return 0;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛

1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 920  Solved: ...

最长上升子序列

  • 2016-04-16 13:56
  • 631B
  • 下载

【bzoj3173】[Tjoi2013]最长上升子序列

Description给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input第一行一个...

bzoj3171 最长上升子序列 Treap&Lis

首先用平衡树把最后的序列维护出来,然后统计每一位为结尾的LIS长度。然后维护一下答案就好了。 AC代码如下: #include #include #include #include #define N...

BZOJ3173 [Tjoi2013]最长上升子序列(离线处理+Treap+LIS)

【题解】 离线处理: 第n个数的插入不会改变前n-1个数的相对位置,因此可以直接求得最终序列,第i次操作的答案就是仅含1~i的LIS  最终序列可以用Treap求得; 由于仅含1~i的LI...

【bzoj3173】【Tjoi2013】【最长上升子序列】treap+dp二分优化

[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61560361 向大(hei)佬(e)实力学(di)习(...

bzoj3173 [Tjoi2013]最长上升子序列 dp Treap

bzoj3173 [Tjoi2013]最长上升子序列 题意:依此插入1-n 求每插完一次的LIS 分析:每个数是按照升序插入的,因此每新加入一个数,不会影响之前的答案,那么我们就可以求出最后的序列...

bzoj3173【TJOI2013】最长上升子序列

二分+树状数组
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)