nyoj214单调递增子序列(二)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=214

题目解析:此题可以dp解决,但是数据大时会超时,也可以用另一种方法解决。

代码如下:

超时代码:

01. #include<cstdio>
02. #include<cstring>
03. #include<algorithm>
04. using namespace std;
05. int a[100010];
06. int dp[100010];
07.  
08. int main()
09. {
10. int n;
11. while(scanf("%d",&n)!=EOF)
12. {
13. for(int i=1;i<=n;i++)
14. scanf("%d",&a[i]);
15. memset(dp,0,sizeof(dp));
16. for(int i=1;i<=n;i++)
17. {
18. dp[i]=1;
19. for(int j=1;j<=i;j++)
20. {
21. if(a[j]<a[i])
22. dp[i]=max(dp[i],dp[j]+1);
23. }
24. }
25. int ans=dp[1];
26. for(int j=2;j<=n;j++)
27. {
28. if(dp[j]>ans)
29. ans=dp[j];
30. }
31. printf("%d\n",ans);
32. }
33. return 0;
34. }
另一种方法:

01. #include<cstdio>
02. #include<cstring>
03. #include<algorithm>
04. using namespace std;
05.  
06. int s[100006];
07. int main()
08. {
09. int n;
10. while(scanf("%d",&n)!=EOF)
11. {
12. memset(s,0,sizeof(s));
13. int top=1;
14. int t;
15. scanf("%d",&t);
16. s[top]=t;
17. for(int i=2;i<=n;i++)
18. {
19. scanf("%d",&t);
20. if(t>s[top])
21. {
22. top++;
23. s[top]=t;
24. }
25. else                    //二分,如果前面有与t相等的,就替换,否则找到一个刚好比t小的然后替换,保证
26. //  整个序列是有序的,并且相对来说是最小的,为了给后面留下更多的空间
27. {
28. int low=1;
29. int high=top;
30. while(low<=high)
31. {
32. int mid=(low+high)/2;
33. if(t>s[mid])
34. low=mid+1;
35. else
36. high=mid-1;
37. }
38. s[low]=t;
39. }
40. }
41. printf("%d\n",top);
42. }
43. return 0;
44. }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值