题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5773

题目大意

  T组数据,n个数(n<=100000),求最长上升子序列长度(0可以替代任何自然数)

题目思路:

  【动态规划】【二分】【最长上升子序列】

  按最长上升子序列做,遇到0的时候更新所有长度的最优解。(这种暴力解法都能过?而且还比标解快?)

  1. //
  2. //by coolxxx
  3. //
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<string>
  7. #include<iomanip>
  8. #include<memory.h>
  9. #include<time.h>
  10. #include<stdio.h>
  11. #include<stdlib.h>
  12. #include<string.h>
  13. //#include<stdbool.h>
  14. #include<math.h>
  15. #define min(a,b) ((a)<(b)?(a):(b))
  16. #define max(a,b) ((a)>(b)?(a):(b))
  17. #define abs(a) ((a)>0?(a):(-(a)))
  18. #define lowbit(a) (a&(-a))
  19. #define sqr(a) ((a)*(a))
  20. #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
  21. #define eps (1e-8)
  22. #define J 10000000
  23. #define MAX 0x7f7f7f7f
  24. #define PI 3.1415926535897
  25. #define N 100004
  26. using namespace std;
  27. typedef long long LL;
  28. int cas,cass;
  29. int n,m,lll,ans;
  30. int a[N],q[N];
  31. void work()
  32. {
  33. int i,j,l,r,mid;
  34. lll=;
  35. memset(q,-,sizeof(q));
  36. for(i=;i<=n;i++)
  37. {
  38. if(a[i]==)
  39. {
  40. q[lll+]=q[lll]+;
  41. for(j=lll;j>;j--)q[j]=min(q[j-]+,q[j]);
  42. q[]=;lll++;
  43. continue;
  44. }
  45. l=,r=lll;
  46. while(l<r)
  47. {
  48. mid=(l+r+)>>;
  49. if(a[i]>q[mid])l=mid;
  50. else r=mid-;
  51. }
  52. q[r+]=a[i];
  53. lll=max(lll,r+);
  54. }
  55. }
  56. int main()
  57. {
  58. #ifndef ONLINE_JUDGE
  59. freopen("1.txt","r",stdin);
  60. // freopen("2.txt","w",stdout);
  61. #endif
  62. int i,j;
  63. // for(scanf("%d",&cas);cas;cas--)
  64. for(scanf("%d",&cas),cass=;cass<=cas;cass++)
  65. // while(~scanf("%s",s))
  66. // while(~scanf("%d",&n))
  67. {
  68. printf("Case #%d: ",cass);
  69. scanf("%d",&n);
  70. for(i=;i<=n;i++)
  71. {
  72. scanf("%d",&a[i]);
  73. }
  74. work();
  75. printf("%d\n",lll);
  76. }
  77. return ;
  78. }
  79. /*
  80. //
  81.  
  82. //
  83. */

  正解是把0先都拿出来,非0的数都减去它前面0的个数(0可以变成任何自然数),求最长上升子序列,再把0的数加上即为答案。

  1. //
  2. //by coolxxx
  3. ////<bits/stdc++.h>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<string>
  7. #include<iomanip>
  8. #include<memory.h>
  9. #include<time.h>
  10. #include<stdio.h>
  11. #include<stdlib.h>
  12. #include<string.h>
  13. //#include<stdbool.h>
  14. #include<math.h>
  15. #define min(a,b) ((a)<(b)?(a):(b))
  16. #define max(a,b) ((a)>(b)?(a):(b))
  17. #define abs(a) ((a)>0?(a):(-(a)))
  18. #define lowbit(a) (a&(-a))
  19. #define sqr(a) ((a)*(a))
  20. #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
  21. #define mem(a,b) memset(a,b,sizeof(a))
  22. #define eps (1e-8)
  23. #define J 10000000
  24. #define MAX 0x7f7f7f7f
  25. #define PI 3.14159265358979323
  26. #define N 100004
  27. using namespace std;
  28. typedef long long LL;
  29. int cas,cass;
  30. int n,m,lll,ans;
  31. int a[N],q[N];
  32. void work()
  33. {
  34. int i,j,l,r,mid;
  35. lll=;
  36. memset(q,-,sizeof(q));
  37. for(i=;i<=n;i++)
  38. {
  39. l=,r=lll;
  40. while(l<r)
  41. {
  42. mid=(l+r+)>>;
  43. if(a[i]>q[mid])l=mid;
  44. else r=mid-;
  45. }
  46. q[r+]=a[i];
  47. lll=max(lll,r+);
  48. }
  49. }
  50. int main()
  51. {
  52. #ifndef ONLINE_JUDGE
  53. freopen("1.txt","r",stdin);
  54. // freopen("2.txt","w",stdout);
  55. #endif
  56. int i,j;
  57. // for(scanf("%d",&cas);cas;cas--)
  58. for(scanf("%d",&cas),cass=;cass<=cas;cass++)
  59. // while(~scanf("%s",s))
  60. // while(~scanf("%d",&n))
  61. {
  62. printf("Case #%d: ",cass);
  63. scanf("%d",&n);
  64. m=;
  65. for(i=;i<=n;i++)
  66. {
  67. scanf("%d",&a[i]);
  68. if(a[i]==)n--,i--,m++;
  69. else a[i]-=m;
  70. }
  71. work();
  72. printf("%d\n",lll+m);
  73. }
  74. return ;
  75. }
  76. /*
  77. //
  78.  
  79. //
  80. */

  

【动态规划】【二分】【最长上升子序列】HDU 5773 The All-purpose Zero的更多相关文章

  1. HDU 4604 Deque 二分最长上升子序列

    题目大意就是给一个deque 然后有n个数,依次进行操作,每种操作,你可以把这个数放在deque首部,也可以放在尾部,也可以扔掉不管,但是要保证deque中的数是非递减的.最要求deque中最长能是多 ...

  2. 动态规划:最长上升子序列(二分算法 nlogn)

    解题心得: 1.在数据量比较大的时候n^2会明显超时,所以可以使用nlogn 的算法,此算法少了双重循环,用的lower_bound(二分法). 2.lis中的数字并没有意义,仅仅是找到最小点lis[ ...

  3. HDU 1159 Common Subsequence (动态规划、最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. HDU 1243 反恐训练营 (动态规划求最长公共子序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. 动态规划:最长上升子序列(LIS)

    转载请注明原文地址:http://www.cnblogs.com/GodA/p/5180560.html 学习动态规划问题(DP问题)中,其中有一个知识点叫最长上升子序列(longest  incre ...

  6. 动态规划初步--最长上升子序列(LIS)

    一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...

  7. 【动态规划】最长上升子序列(LIS)

    今天看了<挑战程序设计竞赛>的动态规划部分,感觉对以前一些知其然却不知其所以然的问题有了更好的理解,先整理一部分. 题意: 有一个长为n的数列a0,a1,a2,...,an .请求出这个序 ...

  8. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  10. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

随机推荐

  1. 某PHP代码加密

    <?php /* 本程序已加密: 2014-11-15 10:10:11 */ xs_run('JGxosS9QplmqLA6qjYo/LiX5ecUe0DH7p42Ww/Mdkf5/ybZDs ...

  2. PHP 进行统一邮箱登陆的代理实现(swoole)

    在工作的过程中,经常会有很多应用有发邮件的需求,这个时候需要在每个应用中配置smtp服务器.一旦公司调整了smtp服务器的配置,比如修改了密码等,这个时候对于维护的人员来说要逐一修改应用中smtp的配 ...

  3. iOS中JavaScript和OC交互

    转载自:http://www.devzeng.com/blog/ios-uiwebview-interaction-with-javascript.html 还可参考的文章:http://blog.c ...

  4. 查看Jquery版本

    1. $.fn.jquery > "1.11.1" 2. 通过这样可以 判断一个对象是否是jquery对象!!

  5. ROW_NUMBER分页的注意事项

    之前在使用ROW_NUMBER分页获取数据的时候,直接用ROW_NUMBER里的SELECT语句查出了所有的数据. like this: select * from ( select row_numb ...

  6. 用连接池提高Servlet访问数据库的效率

    Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍 ...

  7. js时间戳与日期格式之间的互转

    1. 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 注意:如果是uinx时间戳记得乘于1000.比如php函数time()获得 ...

  8. magento前台访问错误

    前台访问出现错误 General error: 145 Table './dbname/tablename' ismarked as crashed and should be repaired 解决 ...

  9. WordPress批量修改文章内容、URL链接、文章摘要

    通过SQL语句来批量修改wordpress博客内容,文章中所有语句都使用默认的wp_表前缀,如果您的数据表前缀不是wp_则需要在语句中作相应更改. 方法/步骤   批量修改文章内容 如果您想替换之前写 ...

  10. python自动开发之(django)第十九天

    一.路由系统,URL 1.函数及类 函数:url(r'^index/', views.index), 类:url(r'^home/', views.Home.as_view()), 2.顺序 url( ...