看到“你必须用低于你上次购买它的价格购买它”,有没有想到什么?没错,又是LIS,倒过来的LIS,所以我们只要把读入的序列倒过来就可以求LIS了,第一问解决。

首先要厘清的是,对于这一题第二问貌似用\(nlog_{2}n\)的算法不是很好,因为我们需要序列中每一个位置可以接成LIS的长度。再看看数据范围,会发现\(n^2\)完全可做。仔细想一想,不难发现第二问其实也是个\(DP\):若\(f[i]\)表示以\(i\)位置为结尾的LIS的长度,\(c[i]\)表示序列\(1\)~\(i\)位置按照最优选择的方案数,则状态转移方程\(c[i]=\sum\limits_{1\leqslant j<i,a[i]>a[j],f[i]=f[j]+1}c[j]\),同时还要去重\(c[i]-=\sum\limits_{1\leqslant j<i,a[i]=a[j],f[i]=f[j]}c[j]\)。

代码

``` cpp
#include
#include

using namespace std;

const int N = 5005;

int n, a[N], f[N], c[N], ans1, ans2;

int main() {

ios_base::sync_with_stdio(false);

cin.tie(0);

cin >> n;

for(int i = 1; i <= n; i++) cin >> a[n+1-i];

for(int i = 1; i <= n; i++) { \常规n^2解法

f[i] = 1;

for(int j = 1; j < i; j++)

if(a[i]>a[j]) f[i] = max(f[i], f[j]+1);

ans1 = max(ans1, f[i]);

}

for(int i = 1; i <= n; i++) {

if(f[i] == 1) c[i] = 1; \初始化

for(int j = 1; j < i; j++) {

if(f[i] == f[j] && a[i] == a[j]) c[i] -= c[j]; \去重

if(f[i] == f[j]+1 && a[i] > a[j]) c[i] += c[j]; \状态转移

}

}

for(int i = 1; i <= n; i++)

if(f[i] == ans1) ans2 += c[i]; \统计答案

cout << ans1 << " " << ans2;

return 0;

}

洛谷P1108 低价购买题解的更多相关文章

  1. 洛谷 P1108 低价购买

    P1108 低价购买 标签 动态规划 难度 提高+/省选- 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:& ...

  2. 洛谷 P1108 低价购买 解题报告

    P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买&quo ...

  3. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  4. 洛谷P1108 低价购买

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  5. 洛谷P1108 低价购买 (最长下降子序列方案数)(int,long long等 范围)

    这道题用n方的算法会很好做 我一开始想的是nlogn的算法求方案数, 然后没有什么想法(实际上也可以做,但是我太弱了)我们就可以根据转移方程来推方案数,只是把max改成加,很多动规题 都是这样,比如背 ...

  6. 洛谷 P1108 低价购买(LIS,统计方案数)

    传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一 ...

  7. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  8. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  9. 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...

随机推荐

  1. Python第八天 模块 包 全局变量和内置变量__name__ Python path

    Python第八天  模块   包   全局变量和内置变量__name__    Python path 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Pyt ...

  2. ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier

    同事玩Docker,在Docker里面启了一个Oracle 10g Express版本,在测试过程中遇到了ORA-00904: "WMSYS"."WM_CONCAT&qu ...

  3. shell脚本批量推送公钥

    目的:新建管理机,为了实现批量管理主机,设置密匙登陆 原理:.通过密钥登陆,可以不用密码 操作过程: 1.生成密匙 ssh-keygen 2.查看密匙 ls   ~/.ssh/ 有私匙id_rsa公匙 ...

  4. window批处理修改计算机名

    一.需要重启 @echo offset /p pcnanme=请输入计算机的名字:reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Com ...

  5. SQLServer之触发器简介

    触发器定义 触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程.SQLServer允许为任何特定语句创建多个触发器.它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作 ...

  6. 【Python 10】汇率兑换3.0(while循环)

    1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 2.案 ...

  7. git、github、gitlab之间的关系

    GIt-版本控制工具:GitHub-一个网站平台,提供给用户空间存储git仓储,保存用户的一些数据文档或者代码等:GitLab - 基于Git的项目管理软件. Git分布式版本控制系统 Git是一款自 ...

  8. SQL LCASE() 函数

    LCASE() 函数 LCASE 函数把字段的值转换为小写. SQL LCASE() 语法 SELECT LCASE(column_name) FROM table_name SQL LCASE() ...

  9. OpenCV 与 OpenGL 的关系是什么?

    OpenCV是 Open Source Computer Vision LibraryOpenGL是 Open Graphics LibraryOpenCV主要是提供图像处理和视频处理的基础算法库,还 ...

  10. 2018-2019-2 20175228实验一《Java开发环境的熟悉》实验报告

    一.实验内容及步骤 (一)使用JDk编译.运行简单的Java程序 实验步骤如下: 实验截图如下: (二)使用IDEA调试程序 1.设置断点2.单步运行:Step Into(快捷捷F7)和Step Ov ...