$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-8;
void File()
{freopen("D:\\in.txt","r",stdin);freopen("D:\\out.txt","w",stdout);
}const int maxn=5010;
int f[maxn][maxn],h[maxn][maxn],n,a[maxn],b[maxn];
int c[maxn][maxn];
int pre[(1<<16)+20];int get(int x)
{int L=1,R=n,res;while(L<=R){int mid=(L+R)/2;if(b[mid]<x) L=mid+1;else if(b[mid]==x) res=mid,L=mid+1;else R=mid-1;}return res;
}int lowbit(int x){return x&(-x);}int sum(int p,int x)
{int res=0;for(int i=x;i>0;i=i-lowbit(i)) res=res+c[p][i];return res;
}void update(int p,int x,int val)
{for(int i=x;i<=5001;i=i+lowbit(i)) c[p][i]=c[p][i]+val;
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+1+n); for(int i=1;i<=n;i++) a[i]=get(a[i]);memset(h,0,sizeof h); memset(c,0,sizeof c);memset(f,0,sizeof f);memset(pre,0,sizeof pre);h[0][0]=1; f[0][0]=1; update(0,5001,1);for(int i=1;i<=n;i++){for(int j=1;j<=i;j++) h[i][j]=sum(j-1,5001)-sum(j-1,a[i]);int p=pre[a[i]];for(int j=1;j<=n;j++) f[i][j]=h[i][j]-h[p][j];for(int j=1;j<=n;j++) update(j,a[i],f[i][j]);pre[a[i]]=i;}for(int j=n;j>=1;j--){int ans=0;for(int i=1;i<=n;i++) ans=ans+f[i][j];if(ans==0) continue;else{printf("%d %d\n",j,ans);break;}}return 0;
}

View Code

事实上,上述做法中很多信息都是冗余的,我们只需记录到$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-8;
void File()
{freopen("D:\\in.txt","r",stdin);freopen("D:\\out.txt","w",stdout);
}const int maxn=5010;
int n,a[maxn],f[maxn],g[maxn];int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++){f[i]=1; g[i]=1; bool flag=0;for(int j=i-1;j>=1;j--){if(a[j]<a[i]) continue;if(a[j]==a[i]){if(flag==0) g[i]=0;break;}else if(a[j]>a[i]){flag=1;if(f[j]+1>f[i]) f[i]=f[j]+1,g[i]=g[j];else if(f[j]+1==f[i]) g[i]=g[i]+g[j];}}}int ans=0; for(int i=1;i<=n;i++) ans=max(ans,f[i]);int ans2=0; for(int i=1;i<=n;i++) if(f[i]==ans) ans2=ans2+g[i];printf("%d %d\n",ans,ans2);return 0;
}

转载于:https://www.cnblogs.com/zufezzt/p/5824488.html

POJ 1952 BUY LOW, BUY LOWER相关推荐

  1. USCACO Buy Low, Buy Lower

    求最长下降子序列简单,难点就是求序列的个数更难的就说处理重复序列.求个数代码还好理解判断重复就是从那个数字一直往前找如果找到一个和它相等的(假设这两个数字为ab),看看这两个数字之间有没有可以和后面数 ...

  2. $Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数

    Luogu Description 求一个长度为n的序列a的最长下降子序列的长度,以及这个长度的子序列种数,注意相同的几个子序列只能算作一个子序列. n<=5000,a[i]不超过long范围 ...

  3. buy low buy lower——伪思考

    过于追求编程数量,却忽略了最重要的方法过程的思考,结果必将是不会思考,还可能养成不爱思考的习惯. 代码 1 #include<stdio.h> 2 #include<stdlib.h ...

  4. 专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办

    文章目录 Running Median Sequence Buy Low Sell High [APIO/CTSC 2007] 数据备份 [NOI2010] 超级钢琴 「LibreOJ β Round ...

  5. CodeForces - 867E Buy Low Sell High (贪心 +小顶堆)

    https://vjudge.net/problem/CodeForces-867E 题意 一个物品在n天内有n种价格,每天仅能进行买入或卖出或不作为一种操作,可以同时拥有多种物品,问交易后的最大利益 ...

  6. [ CodeForces 865 D ] Buy Low Sell High

    \(\\​\) \(Description\) 给出\(N\)天股票的价钱\(A_1,...,A_N\),每天可以什么都不做,或者买入或卖出\(1\)支股票,分别花出或收入\(A_i\)元,求最大收益 ...

  7. 51nod 2206 低买高卖codeforces867E Buy Low Sell High 贪心+优先队列

    考虑股票市场,一共有n天. 对于第i天,B君知道股票的价格是每单位a[i]元 在每一天,B君可以选择买入一个单位的股票,卖出一个单位的股票,或者什么都不做. 刚开始B君有无穷多的钱,但是没有任何股票. ...

  8. POJ 1952 DP

    思路: 这题要求最长下降子序列的长度和个数,我们可以增加 数组maxlen[size](记录当前第1个点到第i个点之间的最长下降序列长度) 和maxnum[size](记录1~i之间的最长下降序列个数 ...

  9. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

最新文章

  1. boost log 能不能循环覆盖_如何在 JS 循环中正确使用 async 与 await
  2. 一个简单的if else优化
  3. 基于CSMA -CA协议的无线星型网络的应用案例介绍
  4. 硬核!这所大学包下高铁,接滞留湖北的学生返校!
  5. 机器学习的行业与场景总结
  6. CodeDom系列--事件(event)定义和反射调用
  7. 超清晰的 DNS 原理入门指南 (资源)
  8. Ext.data-DataProxy/ HttpProxy/ MemoryProxy/ ScriptTagProxy
  9. 跨境网上收款 找PayPal没错(获取Client ID 和 secret)
  10. 在TCP三次握手后插入伪造的TCP包
  11. H5跳转支付宝小程序
  12. 数据之美----雪球网股票组合分析
  13. 浏览器主页被篡改解决
  14. 两年软件开发工作总结及未来展望
  15. TP框架中S函数使用方法
  16. 转贴--爱的最高境界
  17. [长期更新]相似单词对比
  18. 从“汽转球”、“差分机”到“机巧伊武”——蒸汽朋克补完计划
  19. 验证集和测试集的区别?
  20. 参考文献正确格式 如何直接得到

热门文章

  1. python必须下载到c盘吗_python为什么要安装到c盘
  2. linux tasklet函数,tasklet和work_struct详解
  3. 计算机英语讲课笔记04
  4. 英语学习笔记2019-11-29
  5. 【codevs1830】【BZOJ1951】古代猪文,数论综合
  6. 安装oracle ora-01005,Exteernal table ORA-29913,ORA-30653,KUP-01005
  7. mysql+after+commit_P8级面试难题,after_sync vs after_commit,哪个性能更好?
  8. 20178.27 万径人踪灭 思考记录
  9. 2017.6.4 problem b 失败总结
  10. 2017.4.20 hanoi双塔问题 思考记录