HDU 2227 Find the nondecreasing subsequences

举报
Linux猿 发表于 2021/08/06 00:34:48 2021/08/06
【摘要】 题目链接~~> 做题感悟:开始想到用 2^n 这样来求子序列但是这样会多算很多(因为你不知道前面比它小的数的顺序是怎样的),很纠结看解题报告+自己理解用了一个晚上。 解题思路:注意:这题如果出现 1 1 1 结果也是 7,并不是 3 。这题需要用到DP 的思想,假设dp[ i ]  为 i 时a[i] 所形成的不递减子序列,那么dp[ i ]  ...

题目链接~~>

做题感悟:开始想到用 2^n 这样来求子序列但是这样会多算很多(因为你不知道前面比它小的数的顺序是怎样的),很纠结看解题报告+自己理解用了一个晚上可怜

解题思路:注意:这题如果出现 1 1 1 结果也是 7,并不是 3 。这题需要用到DP 的思想,假设dp[ i ]  为 i 时a[i] 所形成的不递减子序列,那么dp[ i ]  =  sum ( dp[ j ] ) +1 ( j < i &&   a[ i ] > a[ j ] ) 即:小于a[ i ] 且在 i 前面的所形成的子序列的和。但是这样是不行的 0< n < 100000 如果这样做必定超时。其实仔细观察一下,这要做和求逆序数差不多,向上更新,向下查询,于是要用到树状数组,但是 0 < ai < 2^31 这么大的数肿么办??? 离散化(具体见代码)。

代码:


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<stack>
  5. #include<string>
  6. #include<string.h>
  7. #include<stdlib.h>
  8. #include<math.h>
  9. #include<vector>
  10. #include<queue>
  11. #include<algorithm>
  12. using namespace std ;
  13. #define LEN sizeof(struct node)
  14. #define lld __int64
  15. const double PI = 3.1415926535898 ;
  16. const int INF = 99999999 ;
  17. const double esp = 1e-8 ;
  18. const lld mod= 1000000007 ;
  19. const lld MX = 100005 ;
  20. int n ;
  21. int c[MX],b[MX] ;
  22. struct node
  23. {
  24. int x,y ;
  25. }T[MX] ;
  26. bool cmp(node a,node b)
  27. {
  28. return a.x < b.x ;
  29. }
  30. int lowbit(int x)
  31. {
  32. return x&(-x) ;
  33. }
  34. int get_su(int x) // 求和
  35. {
  36. int ans=0 ;
  37. while(x>0)
  38. {
  39. ans=(ans+c[x])%mod ;
  40. x-=lowbit(x) ;
  41. }
  42. return ans ;
  43. }
  44. void update(int x,int nx)//更新
  45. {
  46. while(x<=n)
  47. {
  48. c[x]=(c[x]+nx)%mod ;
  49. x+=lowbit(x) ;
  50. }
  51. }
  52. int main()
  53. {
  54. while(~scanf("%d",&n))
  55. {
  56. memset(c,0,sizeof(c)) ;
  57. for(int i=1 ;i<=n ;i++)
  58. {
  59. scanf("%d",&T[i].x) ;
  60. T[i].y=i ;
  61. }
  62. stable_sort(T+1,T+1+n,cmp) ;// 切记稳定排序
  63. for(int i=1 ;i<=n ;i++)
  64. b[T[i].y]=i ;
  65. for(int i=1 ;i<=n ;i++)
  66. {
  67. int x=get_su(b[i])+1 ;// 自身也是一个 so +1
  68. update(b[i],x) ;// 在比它大的值那更新
  69. }
  70. printf("%d\n",get_su(n)) ;
  71. }
  72. return 0 ;
  73. }


 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/22958795

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。