游戏之消除(最长递增序列)

Posted qq-1585047819

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游戏之消除(最长递增序列)相关的知识,希望对你有一定的参考价值。

描述

 

 

zzx和city一直喜欢一起玩游戏,某一天zzx做了一个丧心病狂的消消乐游戏,游戏是这样的,zzx随机生成一个序列让city从前往后寻找5个数ai(1<=i<=5)如果5个数ai满足a1<a2<a3<a4<a5则可以消除这5个数,然而目前出现了一种情况,就是zzx和city不清楚这个序列还有没有可以消除的方案,所以想请你帮忙判断一下。

 

 

输入

 

 

输入数据有多组,输入到文件结束为止。

第一行输入一个N(106>=N>=5)。

第二行输入N个zzx随机生成的序列(在int32范围内的数字)。

 

 

输出

 

 

如果有可以消除的方案,输出YES,否则输出NO

 

 

样例输入

样例输出

 

解题思路:二分 替换

技术图片
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int n;
 8 const int N=1e6+5;
 9 int dp[N],arr[N];
10 int len;
11 
12 //inline int read()
13 //    int x=0,f=1;
14 //    char ch=getchar();
15 //    while(ch<‘0‘||ch>‘9‘)
16 //        if(ch==‘-‘) f=-1;
17 //        ch=getchar();
18 //    
19 //    while(ch>=‘0‘&&ch<=‘9‘)
20 //        x=(x<<1)+(x<<3)+(ch^48);
21 //        ch=getchar();
22 //    
23 //    return x*f;
24 //
25 
26 void Binary(int num)
27     int left=1,right=len;
28     int ans;
29     while(left<=right)
30         int mid=left+right>>1;
31         if(dp[mid]>=num) ans=mid,right=mid-1;
32         else left=mid+1;
33     
34     dp[ans]=num;
35 
36 
37 int main()
38     while(scanf("%d",&n)!=EOF)
39         for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
40         dp[1]=arr[1];
41         len=1;
42         for(int i=2;i<=n;i++)
43             if(arr[i]>dp[len]) dp[++len]=arr[i];
44             else
45                 Binary(arr[i]);
46             
47         
48         if(len>=5) printf("YES\n");
49         else printf("NO\n");
50     
51     return 0;
52 
View Code

 

以上是关于游戏之消除(最长递增序列)的主要内容,如果未能解决你的问题,请参考以下文章

动态规划之最大递增子序列

算法总结之 最长递增子序列

《LeetCode之每日一题》:107.最长递增子序列

动态规划之----最长递增子序列

动态规划之最长递增子序列(LIS)

算法之动态规划(最长递增子序列——LIS)