$dp$。

一开始想了一个$dp$做法,$dp[i][j]$表示前$i$个数字,下降序列长度为$j$的方案数为$dp[i][j]$,这样做需要先离散化然后用树状数组优化,空间复杂度为${n^2}$,时间复杂度为$O({n^2}\log n)$,这样的做法被$POJ$卡了内存。既然是$MLE$,然后我去$discuss$测了一下数据,发现答案都是对的。

$MLE$:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<stack>
  11. #include<iostream>
  12. using namespace std;
  13. typedef long long LL;
  14. const double pi=acos(-1.0),eps=1e-;
  15. void File()
  16. {
  17. freopen("D:\\in.txt","r",stdin);
  18. freopen("D:\\out.txt","w",stdout);
  19. }
  20.  
  21. const int maxn=;
  22. int f[maxn][maxn],h[maxn][maxn],n,a[maxn],b[maxn];
  23. int c[maxn][maxn];
  24. int pre[(<<)+];
  25.  
  26. int get(int x)
  27. {
  28. int L=,R=n,res;
  29. while(L<=R)
  30. {
  31. int mid=(L+R)/;
  32. if(b[mid]<x) L=mid+;
  33. else if(b[mid]==x) res=mid,L=mid+;
  34. else R=mid-;
  35. }
  36. return res;
  37. }
  38.  
  39. int lowbit(int x){return x&(-x);}
  40.  
  41. int sum(int p,int x)
  42. {
  43. int res=;
  44. for(int i=x;i>;i=i-lowbit(i)) res=res+c[p][i];
  45. return res;
  46. }
  47.  
  48. void update(int p,int x,int val)
  49. {
  50. for(int i=x;i<=;i=i+lowbit(i)) c[p][i]=c[p][i]+val;
  51. }
  52.  
  53. int main()
  54. {
  55. scanf("%d",&n);
  56. for(int i=;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
  57. sort(b+,b++n); for(int i=;i<=n;i++) a[i]=get(a[i]);
  58.  
  59. memset(h,,sizeof h); memset(c,,sizeof c);
  60. memset(f,,sizeof f);
  61. memset(pre,,sizeof pre);
  62.  
  63. h[][]=; f[][]=; update(,,);
  64.  
  65. for(int i=;i<=n;i++)
  66. {
  67. for(int j=;j<=i;j++) h[i][j]=sum(j-,)-sum(j-,a[i]);
  68. int p=pre[a[i]];
  69. for(int j=;j<=n;j++) f[i][j]=h[i][j]-h[p][j];
  70. for(int j=;j<=n;j++) update(j,a[i],f[i][j]);
  71. pre[a[i]]=i;
  72. }
  73. for(int j=n;j>=;j--)
  74. {
  75. int ans=;
  76. for(int i=;i<=n;i++) ans=ans+f[i][j];
  77. if(ans==) continue;
  78. else
  79. {
  80. printf("%d %d\n",j,ans);
  81. break;
  82. }
  83. }
  84.  
  85. return ;
  86. }

事实上,上述做法中很多信息都是冗余的,我们只需记录到$i$位置的最长下降序列的长度$f[i]$以及方案数$g[i]$就可以了。

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<vector>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<stack>
  11. #include<iostream>
  12. using namespace std;
  13. typedef long long LL;
  14. const double pi=acos(-1.0),eps=1e-;
  15. void File()
  16. {
  17. freopen("D:\\in.txt","r",stdin);
  18. freopen("D:\\out.txt","w",stdout);
  19. }
  20.  
  21. const int maxn=;
  22. int n,a[maxn],f[maxn],g[maxn];
  23.  
  24. int main()
  25. {
  26. scanf("%d",&n);
  27. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  28.  
  29. for(int i=;i<=n;i++)
  30. {
  31. f[i]=; g[i]=; bool flag=;
  32. for(int j=i-;j>=;j--)
  33. {
  34. if(a[j]<a[i]) continue;
  35. if(a[j]==a[i])
  36. {
  37. if(flag==) g[i]=;
  38. break;
  39. }
  40. else if(a[j]>a[i])
  41. {
  42. flag=;
  43. if(f[j]+>f[i]) f[i]=f[j]+,g[i]=g[j];
  44. else if(f[j]+==f[i]) g[i]=g[i]+g[j];
  45. }
  46. }
  47. }
  48.  
  49. int ans=; for(int i=;i<=n;i++) ans=max(ans,f[i]);
  50. int ans2=; for(int i=;i<=n;i++) if(f[i]==ans) ans2=ans2+g[i];
  51. printf("%d %d\n",ans,ans2);
  52.  
  53. return ;
  54. }

POJ 1952 BUY LOW, BUY LOWER的更多相关文章

  1. POJ 1952 BUY LOW, BUY LOWER 动态规划题解

    Description The advice to "buy low" is half the formula to success in the bovine stock mar ...

  2. USACO Section 4.3 Buy low,Buy lower(LIS)

    第一眼看到题目,感觉水水的,不就是最长下降子序列嘛!然后写……就呵呵了..要判重,还要高精度……判重我是在计算中加入各种判断.这道题比看上去麻烦一点,但其实还好吧.. #include<cstd ...

  3. POJ-1952 BUY LOW, BUY LOWER(线性DP)

    BUY LOW, BUY LOWER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9244 Accepted: 3226 De ...

  4. USACO 4.3 Buy Low, Buy Lower

    Buy Low, Buy Lower The advice to "buy low" is half the formula to success in the stock mar ...

  5. poj1952 BUY LOW, BUY LOWER【线性DP】【输出方案数】

    BUY LOW, BUY LOWER Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:11148   Accepted: 392 ...

  6. 洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower

    P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower 题目描述 “逢低吸纳”是炒股的一条成功秘诀.如果你想成为一个成功的投资者,就要遵守这条秘诀: "逢低吸纳,越低越 ...

  7. [POJ1952]BUY LOW, BUY LOWER

    题目描述 Description The advice to "buy low" is half the formula to success in the bovine stoc ...

  8. Buy Low, Buy Lower

    Buy Low, Buy Lower 给出一个长度为N序列\(\{a_i\}\),询问最长的严格下降子序列,以及这样的序列的个数,\(1 <= N <= 5000\). 解 显然我们可以很 ...

  9. BUY LOW, BUY LOWER_最长下降子序列

    Description The advice to "buy low" is half the formula to success in the bovine stock mar ...

随机推荐

  1. CSLA .NET是一个.NET软件开发框架

    CSLA .NET是一个.NET软件开发框架,帮助开发者“为Windows.Web.面向服务和工作流等应用构建强大和可维护的业务逻辑层”. CSLA是Component-based, Scalable ...

  2. 字符串比较strcmp

    问题: 原型:extern int strcmp(const char *s1,const char * s2); 所在头文件:string.h 功能:比较字符串s1和s2. 一般形式:strcmp( ...

  3. IOS开发之路三(XML解析之GDataXML的使用)

    最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...

  4. XP系统安装ArcGIS10.0需要修改的一个配置

    1,右击我的电脑,查看属性. 2,选择“高级”选项卡,“启动和故障恢复”单击“设置”.   3,在“默认操作系统”中单击“编辑”:   4,在弹出的boot.ini文档中把操作系统改成相应的操作系统, ...

  5. JavaScript的基本类型总结

    看了让你有收获的JavaScript的基本类型总结   Javascript是一种弱类型语言,没有明确的类型分类:网上分类的方式比较多,个人感觉不比去特别的追究细分是什么什么类型,若是能够明确的分出类 ...

  6. DRP项目总结

    DRP项目在6号就已经完工了,总共花费了一个半月的时间,从对java的懵懵懂懂,到现在的略微熟悉,对整个java web开发的认知,清晰了很多.涉及到的web项目开发的必备知识,也都有一次得到锻炼和提 ...

  7. 对C# 中Readonly的再认识

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理    readonly为运行时常量,程序运行 ...

  8. JSP实现页面跳转的方式

    js实现页面跳转的几种方式普通方式 第一种: <script language="javascript" type="text/javascript"&g ...

  9. hdu 1507

    求能出售多少个1*2的矩形,,将原图染色,(i+j)%2==0的染白色,其余为黑色, 求白色跟黑色的最大匹配 #include<stdio.h> #include<string.h& ...

  10. java动态加载配置文件

    最近项目中需要做定时任务,即定时数据库的备份.定时时间用户可以在界面中配置,要求配置修改好立即生效. 想不到什么好办法.下面是一种实现思路 把用户配置的时间存到properties配置文件中,定时任务 ...