POJ1952BUY LOW, BUY LOWER题解动态规划DP

P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower 题目描述 “逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀: "逢低吸纳,越低越买" 这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。 给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。 以下面这个表为例, 某几天的股价是: 天数 1 2 3 4 5 6 7 8 9 10 11 12 股价 阅读详情
BUY LOW, BUY LOWER
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 4652 Accepted: 1563

Description

The advice to "buy low" is half the formula to success in the bovine stock market.To be considered a great investor you must also follow this problems' advice:
                    "Buy low; buy lower"

Each time you buy a stock, you must purchase it at a lower price than the previous time you bought it. The more times you buy at a lower price than before, the better! Your goal is to see how many times you can continue purchasing at ever lower prices.

You will be given the daily selling prices of a stock (positive 16-bit integers) over a period of time. You can choose to buy stock on any of the days. Each time you choose to buy, the price must be strictly lower than the previous time you bought stock. Write a program which identifies which days you should buy stock in order to maximize the number of times you buy.

Here is a list of stock prices:
 Day   1  2  3  4  5  6  7  8  9 10 11 12

Price 68 69 54 64 68 64 70 67 78 62 98 87


The best investor (by this problem, anyway) can buy at most four times if each purchase is lower then the previous purchase. One four day sequence (there might be others) of acceptable buys is:
Day    2  5  6 10

Price 69 68 64 62

Input

* Line 1: N (1 <= N <= 5000), the number of days for which stock prices are given

* Lines 2..etc: A series of N space-separated integers, ten per line except the final line which might have fewer integers.

Output

Two integers on a single line:
* The length of the longest sequence of decreasing prices
* The number of sequences that have this length (guaranteed to fit in 31 bits)

In counting the number of solutions, two potential solutions are considered the same (and would only count as one solution) if they repeat the same string of decreasing prices, that is, if they "look the same" when the successive prices are compared. Thus, two different sequence of "buy" days could produce the same string of decreasing prices and be counted as only a single solution.

Sample Input

12
68 69 54 64 68 64 70 67 78 62
98 87

Sample Output

4 2

Source

经典的LIS问题,关键是求不重复的子串数量
DP时多求了一个为了记录前面不重复的子串数量
O(nlogn)算法
设原来的序列为A[],不失一般性,我们只考虑严格递增的情况(原题是递减)
用L[i]表示以A[i]结尾的LIS的长度
用cnt[i]纪录以A[i]结尾的且长度为L[i]的本质不同的LIS的数量,首先用nlogn的算法计算出所有元素的L值
然后依次扫描A[1],A[2],……A[n],每扫一个元素,就统计该元素的cnt的值,然后把元素插入到一个list链表中
list[k]只保存L值为k的元素,list[k]中的元素按升序排列(相同元素只保留一个),一共有n个list。

例如对于序列,1,5,3,2,6

list[1]:1
list[2]:2,3,5
list[3]: 6

此时如果扫描到一个4,那么显然该元素的L值为3。
也就是说4应该插入list[3]中。在插入之前必须先统计以元素4的cnt值。
计算这个cnt值的方法如下:在list[2]中找到第一个比4小的元素i(例子中就是3),那么从表头元素到i的所有元素的cnt总和就是4的cnt值。
关键在于如何快速找到list[2]中第一个比4小的元素,我们只要纪录一个pos指针,初始化的时候pos指向链表最末尾元素,查找的过程相当于向左移动指针的过程,直到遇到一个比4小的元素。如果下次仍然是在list[2]中查找,那么只要从pos开始往前查找即可(想想为什么不用从尾元素开始)。

得到以4结尾的cnt值后,再把4插入到list[3]中,由于4一定是最小的元素(想想为什么),所以一定是头插入。

最后要注意的是如果list[k]有两个元素相同,只留下一个。

注:L[i]需要在扫描前就计算出来
解决Windows 10安装语言包时遇到的0x800F0954错误 在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。 阅读详情

相关推荐

python文件转为可执行文件(.exe)的详细步骤

本文详细介绍了如何从零开始把python文件打包成为可执行文件(.exe)。

m0_67093160的博客 3万+

动态规划 Buy Low, Buy Lower 逢低吸纳

“逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀: "逢低吸纳,越低越买" 这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。 给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。 以下面这个表为例, 某几天的股价是: 天数 1 2 3 4 5 6 7 8 9 10 11 12 股价 68

weixin_44686879的博客 917

五分钟搞懂游戏开发中的抗锯齿算法

常见抗锯齿算法总结锯齿由来抗锯齿算法SSAAMSAACSAA 锯齿由来 场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一...

绿洲守望者 1万+

poj 1952 BUY LOW, BUY LOWER【解法一】

dp统计方案数

YHaX的博客 684

ESP32小车DIY:从零搭建无线遥控智能车(附完整代码与避坑指南)

本文详细介绍了如何从零开始DIY一台基于ESP32的无线遥控智能小车。内容涵盖核心硬件选型、电路设计、低延迟ESP-NOW无线通信协议的配置与实战,以及双电机差速控制算法与PWM调速的实现。文章提供了完整的代码示例和关键的避坑指南,旨在帮助开发者快速构建稳定可靠的智能车平台,并为进一步的功能扩展奠定基础。

gamma的博客 470

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4613

Buy Low, Buy Lower 逢低吸纳

https://oj.jdfz.com.cn/oldoj/problem.php?id=1821题解:本题求最长下降子序列,然后求最长下降子序列的个数,并且不能重复。这就尴尬了…… 才发现,我竟然只会前一半…… 最近疯狂刷DP,还是有一些成效的,至少可以写出一个靠谱点的动态转移方程了,设g[i]代表当到第i个数时,长度最长的最长下降子序列个数。 得出 g[i]=sum(g[j])

lbz8o8 的博客 440

法兰克仿真软件FANUC CNC Guide v25.0 安装教程及中文设置

下载地址在文末。我们公司用新到一批FANUC 系统的设备,为方便使用就装了一个 FANUC 数控系统仿真软件FANUC CNC Guide v25.0 ,还是最新版不是市面上流传的老版本。模拟学习一下。

hakesashou的博客 1万+

BUY LOW, BUY LOWER

BUY LOW, BUY LOWER的代码+解释,主要参考POJ BUY LOW, BUY LOWER,比原文多了些注释和自己的理解程序主要分为3部分: 求以num[i] 结尾的最长下降子序列的长度dp 求以num[i] 结尾的不重复的最长下降子序列的方案数 project 选择最大的dp值,并求该dp值对应的方案数之和 注:该程序没有实现高精度的计算,所以不适用于数目较多的数据集#include

lizongkai-big 529

瑞芯微RK3568与RK3566芯片选型指南:从接口差异到应用场景深度解析

在嵌入式系统与边缘计算领域,芯片选型是决定产品成败的关键一步。其核心在于理解芯片的架构、接口扩展能力与系统可靠性之间的平衡。以瑞芯微(Rockchip)的RK3568和RK3566为例,这两款同为四核A55架构的芯片,在基础算力上相近,但其面向的应用赛道却因接口配置而截然不同。RK3568凭借其双千兆网口、PCIe 3.0高速接口以及全链路ECC内存支持,在技术价值上更侧重于构建高可靠、高扩展性的系统,如边缘计算网关、工业控制器和网络视频录像机(NVR)。相比之下,RK3566则以其精简的接口配置,精准服务

weixin_33314040的博客 480

Python爬虫博客:如何抓取时事新闻信息 —— 从各大新闻网站获取实时新闻数据

发送请求:向目标新闻网站发送 HTTP 请求,获取网页内容。解析网页:使用解析库(如)从网页中提取新闻标题、摘要、内容、发布时间等。绕过反爬虫机制:使用代理、设置请求头、模拟浏览器行为等策略绕过反爬虫技术。数据存储与清洗:将抓取的数据保存到本地文件或数据库中,并进行清洗,确保数据的可用性。在抓取过程中,我们还会面对很多实际问题,比如反爬虫技术、分页抓取、动态加载的内容等。接下来,我们将逐步介绍如何使用不同技术抓取静态和动态网页,并对抓取的内容进行处理。Scrapy。

2201_76125261的博客 2135

[POJ 1952] BUY LOW,BUY LOWER

[题目链接] http://poj.org/problem?id=1952 [算法] DP [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> ...

145

HFSS 3D Layout仿真PCB操作说明

本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。

sinat_15150363的博客 3938

题解 【POJ1952】 BUY LOW, BUY LOWER

题目意思: 给你一个长度为\(n\)(\(1<=n<=5000\))的序列,并求出最长下降子序列的长度及个数, 并且,如果两个序列中元素的权值完全相同,那么即使它们的位置不一样,也只算一种情况. 解析 长度应该都能轻松求出来吧. 然而,情况数却有点难求啊.. 其实主要是去重(要不然用计数\(DP\)也能过)... 但仔细想想, 首先,我们设\(f[i]\)为以\(i\)结尾的最长下降子...

weixin_30326745的博客 107

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

poj 1952 BUY LOW, BUY LOWER[最长单调子序列变形]

题目:poj 1952 BUY LOW, BUY LOWER 题意:给出一个序列,先求最长单调递减子序列,然后求在子序列最长的情况下,不同的长度都为最长的的子序列的个数。(比如3,2,1和3,2,1属于相同,只能算一个)分析:首先用一个dp【i】表示到当前i点的最长子序列的长度 用dp2【i】表示最长为dp【i】的子序列的个数 然后dp【i】 = max(dp【j】)+1 (1<=j/****

大神养成中..... 1369

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj 1952 buy low buy lower(DP)

描述 Description “低买高卖”是在神牛证券市场上成功的秘诀的一半。作为一个好的投资者,你必须还遵守下面这条建议: “逢低吸纳,越低越买” 每次你购买股票的时候,你必须以比上次购买这只股票的价格更低的价格来购买这只股票。购买比上次便宜的股票的次数越多越好!你的目标是计算像这样的低价进仓最多可以进行多少次。 数据会给你一只股票在一段时期内每日的交易价格(16位正整数)。你...

Aike0201的博客 214

POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数

注意:重复的只算一次 如何去掉一些重复的是本题的关键 我的去重思路: 7 5 3 7 6 3 2 1 6 5 3 7 3 1 5 5 3 2 1 3 第一组在推到 数字 2 的时候有 3会出现重复, 显然前面一个3是可有可无的。 第二组也一样,前面一个3是可有可无的。 1.如果最长下降序列中有后面一个3, 如第一二组数据,那么前面一个3是无用的,在推好后面一个3之后把之前的所

Nicolas 1263

POJ 1952 BUY LOW, BUY LOWER DP记录数据

最长递减子序列。加记录有多少个最长递减子序列。然后须要去重。 最麻烦的就是去重了。 主要的思路就是:全面出现反复的值,然后还是同样长度的子序列。这里的DP记录的子序列是以当前值为结尾的时候,而且一定选择这个值的最长递减子序列。 那么就须要减去前面已经出现过了的子序列。 有点绕口。 举例就是9 8 9 8 2 和 10 5 12 5 3;这些样例去重。 本类型的题目假设不...

aoe41606的博客 116

POJ1952 BUY LOW, BUY LOWER

这题要求最长下降子序列的长度和个数,我们可以增加 数组maxlen[size](记录当前第1个点到第i个点之间的最长下降序列长度) 和maxnum[size](记录1~i之间的最长下降序列个数 ) ,首先对于最长下降序列属于DP基础题,只要对每一个a[i]求出符合要求(a[i] 在序列中,如果maxlen[j]+1 == maxlen[i]则说明a[i]和a[j]在同一个下降数列中(显然必有a

云游code的博客 3833

poj 1952 BUY LOW, BUY LOWER dp

点击打开题目链接

cstdio_hao的专栏 496

POJ 1952 BUY LOW, BUY LOWER

POJ - 1952 BUY LOW, BUY LOWER Time Limit:1000MS   Memory Limit:30000KB   64bit IO Format:%I64d & %I64u SubmitStatus Description The advice to "buy low" is half the formu

? 550

POJ 1952 BUY LOW, BUY LOWER DP

BUY LOW , BUY LOWER Time Limit: 1000MS Memory Limit: 30000KB http://poj.org/problem?id=1952 先来看看description: Each time you buy a stock, you must purchase it at a lower price than the pr

Stitch_11752的博客 479

POJ 1952 buy low,buy lower

非常漂亮的动归题目,程序里面的问题都是自己找出来的,做了3天,比较爽。这个题目说白了就是先让你求最长递减序列的长度,然后去掉重复的。这个题目关键在于去掉重复的。a[i]表示所储存的元素,然后是dp[i]表示到第i个元素的时候(包括这个元素)的最长递减序列的长度,count[i]是用来记录到第i个元素长度是dp[i]的所有结果有多少个。 现在分析去重问题。 这是这组数据的结果,dp[i]的求法就

kungfu panda 1569

poj 1952 Buy low, buy lower

最长递减子序列的加强版,本题中序列相同的算是同一种  比如3211,最后一个1就可以不计数。所以这里面还需要特殊判断。     #include #include #include #define N 5001 using namespace std; int n,arr[N],dp[N],num[N]; int Max(int a1,int b1) { return a1>b1?a1:b

purevegetable 845

poj1952--BUY LOW, BUY LOWER题解

来源:http://poj.org/problem?id=1952 思路:此题第一问是要求最长递减数列的长度,这问用DP很容易解决,但关键是第二问要求最长递减数列的个数,下面直接贴代码。 代码:#include <stdio.h> int main() { int n,a[5001],b[5001],f[5001],max,tot; //a数组记录价格,b数组记录第i天之前的最长

ME495的博客 582

POJ1952 BUY LOW, BUY LOWER DP

题意: 给一串数字,求最大的严格下降子序列,且还有求出这种序列的个数。 但是同时要注意重复序列只算一个。 比如 5 5 4 4 3,只有一种5 4 3.答案是3 1.  思路: 对于严格单调子序列。算是很简单了吧。直接O(N^2)的复杂度实现即可。 至于找次数,其实本质也是DP,具体见代码。 #include #include #define max(a,b) (a>b?a:

Aszxqw 816

POJ 1952 BUY LOW, BUY LOWER

来源:http://poj.org/problem?id=1952 题意:求最长单调递减子序列的长度以及有多少种途径到达该最长单调递减子序列。 思路:求最长单调递减子序列是比较容易的了,关键是求路径的条数。而且还要去重。如5 5 2 2 1,其实是只有一条5 2 1。该题难点就在于去重,去重方法如下: 我们在求单调递减子序列的时候,可以用一个二重for循环求,在循环中dp[i]表示的是到第i

784
上一篇: POJ1141Brackets Sequence动态规划DP
下一篇: POJ2353Ministry题解动态规划DP
power721
博客等级 码龄18年 176粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值