POJ 1952 BUY LOW, BUY LOWER
$dp$。
一开始想了一个$dp$做法,$dp[i][j]$表示前$i$个数字,下降序列长度为$j$的方案数为$dp[i][j]$,这样做需要先离散化然后用树状数组优化,空间复杂度为${n^2}$,时间复杂度为$O({n^2}\log n)$,这样的做法被$POJ$卡了内存。既然是$MLE$,然后我去$discuss$测了一下数据,发现答案都是对的。
$MLE$:
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<iostream>
- using namespace std;
- typedef long long LL;
- const double pi=acos(-1.0),eps=1e-;
- void File()
- {
- freopen("D:\\in.txt","r",stdin);
- freopen("D:\\out.txt","w",stdout);
- }
- const int maxn=;
- int f[maxn][maxn],h[maxn][maxn],n,a[maxn],b[maxn];
- int c[maxn][maxn];
- int pre[(<<)+];
- int get(int x)
- {
- int L=,R=n,res;
- while(L<=R)
- {
- int mid=(L+R)/;
- if(b[mid]<x) L=mid+;
- else if(b[mid]==x) res=mid,L=mid+;
- else R=mid-;
- }
- return res;
- }
- int lowbit(int x){return x&(-x);}
- int sum(int p,int x)
- {
- int res=;
- for(int i=x;i>;i=i-lowbit(i)) res=res+c[p][i];
- return res;
- }
- void update(int p,int x,int val)
- {
- for(int i=x;i<=;i=i+lowbit(i)) c[p][i]=c[p][i]+val;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];
- sort(b+,b++n); for(int i=;i<=n;i++) a[i]=get(a[i]);
- memset(h,,sizeof h); memset(c,,sizeof c);
- memset(f,,sizeof f);
- memset(pre,,sizeof pre);
- h[][]=; f[][]=; update(,,);
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=i;j++) h[i][j]=sum(j-,)-sum(j-,a[i]);
- int p=pre[a[i]];
- for(int j=;j<=n;j++) f[i][j]=h[i][j]-h[p][j];
- for(int j=;j<=n;j++) update(j,a[i],f[i][j]);
- pre[a[i]]=i;
- }
- for(int j=n;j>=;j--)
- {
- int ans=;
- for(int i=;i<=n;i++) ans=ans+f[i][j];
- if(ans==) continue;
- else
- {
- printf("%d %d\n",j,ans);
- break;
- }
- }
- return ;
- }
事实上,上述做法中很多信息都是冗余的,我们只需记录到$i$位置的最长下降序列的长度$f[i]$以及方案数$g[i]$就可以了。
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<iostream>
- using namespace std;
- typedef long long LL;
- const double pi=acos(-1.0),eps=1e-;
- void File()
- {
- freopen("D:\\in.txt","r",stdin);
- freopen("D:\\out.txt","w",stdout);
- }
- const int maxn=;
- int n,a[maxn],f[maxn],g[maxn];
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%d",&a[i]);
- for(int i=;i<=n;i++)
- {
- f[i]=; g[i]=; bool flag=;
- for(int j=i-;j>=;j--)
- {
- if(a[j]<a[i]) continue;
- if(a[j]==a[i])
- {
- if(flag==) g[i]=;
- break;
- }
- else if(a[j]>a[i])
- {
- flag=;
- if(f[j]+>f[i]) f[i]=f[j]+,g[i]=g[j];
- else if(f[j]+==f[i]) g[i]=g[i]+g[j];
- }
- }
- }
- int ans=; for(int i=;i<=n;i++) ans=max(ans,f[i]);
- int ans2=; for(int i=;i<=n;i++) if(f[i]==ans) ans2=ans2+g[i];
- printf("%d %d\n",ans,ans2);
- return ;
- }
POJ 1952 BUY LOW, BUY LOWER的更多相关文章
- POJ 1952 BUY LOW, BUY LOWER 动态规划题解
Description The advice to "buy low" is half the formula to success in the bovine stock mar ...
- USACO Section 4.3 Buy low,Buy lower(LIS)
第一眼看到题目,感觉水水的,不就是最长下降子序列嘛!然后写……就呵呵了..要判重,还要高精度……判重我是在计算中加入各种判断.这道题比看上去麻烦一点,但其实还好吧.. #include<cstd ...
- POJ-1952 BUY LOW, BUY LOWER(线性DP)
BUY LOW, BUY LOWER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9244 Accepted: 3226 De ...
- 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 ...
- poj1952 BUY LOW, BUY LOWER【线性DP】【输出方案数】
BUY LOW, BUY LOWER Time Limit: 1000MS Memory Limit: 30000K Total Submissions:11148 Accepted: 392 ...
- 洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower
P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower 题目描述 “逢低吸纳”是炒股的一条成功秘诀.如果你想成为一个成功的投资者,就要遵守这条秘诀: "逢低吸纳,越低越 ...
- [POJ1952]BUY LOW, BUY LOWER
题目描述 Description The advice to "buy low" is half the formula to success in the bovine stoc ...
- Buy Low, Buy Lower
Buy Low, Buy Lower 给出一个长度为N序列\(\{a_i\}\),询问最长的严格下降子序列,以及这样的序列的个数,\(1 <= N <= 5000\). 解 显然我们可以很 ...
- BUY LOW, BUY LOWER_最长下降子序列
Description The advice to "buy low" is half the formula to success in the bovine stock mar ...
随机推荐
- CSLA .NET是一个.NET软件开发框架
CSLA .NET是一个.NET软件开发框架,帮助开发者“为Windows.Web.面向服务和工作流等应用构建强大和可维护的业务逻辑层”. CSLA是Component-based, Scalable ...
- 字符串比较strcmp
问题: 原型:extern int strcmp(const char *s1,const char * s2); 所在头文件:string.h 功能:比较字符串s1和s2. 一般形式:strcmp( ...
- IOS开发之路三(XML解析之GDataXML的使用)
最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...
- XP系统安装ArcGIS10.0需要修改的一个配置
1,右击我的电脑,查看属性. 2,选择“高级”选项卡,“启动和故障恢复”单击“设置”. 3,在“默认操作系统”中单击“编辑”: 4,在弹出的boot.ini文档中把操作系统改成相应的操作系统, ...
- JavaScript的基本类型总结
看了让你有收获的JavaScript的基本类型总结 Javascript是一种弱类型语言,没有明确的类型分类:网上分类的方式比较多,个人感觉不比去特别的追究细分是什么什么类型,若是能够明确的分出类 ...
- DRP项目总结
DRP项目在6号就已经完工了,总共花费了一个半月的时间,从对java的懵懵懂懂,到现在的略微熟悉,对整个java web开发的认知,清晰了很多.涉及到的web项目开发的必备知识,也都有一次得到锻炼和提 ...
- 对C# 中Readonly的再认识
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly为运行时常量,程序运行 ...
- JSP实现页面跳转的方式
js实现页面跳转的几种方式普通方式 第一种: <script language="javascript" type="text/javascript"&g ...
- hdu 1507
求能出售多少个1*2的矩形,,将原图染色,(i+j)%2==0的染白色,其余为黑色, 求白色跟黑色的最大匹配 #include<stdio.h> #include<string.h& ...
- java动态加载配置文件
最近项目中需要做定时任务,即定时数据库的备份.定时时间用户可以在界面中配置,要求配置修改好立即生效. 想不到什么好办法.下面是一种实现思路 把用户配置的时间存到properties配置文件中,定时任务 ...