一道求最长下降子序列和与最长下降子序列长度相同的方案数的DP


题意:

一串数字,找出最长下降子序列,记录他的长度 \(length\) 并输出

然后找出所有长度达到 \(length\) 的下降子序列个数 \(sum\),并输出


分析

第一问比较 easy

设 \(f [ i ]\) 为 DP 数组,记录以第 \(i\) 个数字为结尾的最长下降子序列的长度;

设 \(d [ i ]\) 为在以 \(i\) 为结尾的最长下降子序列里的最后一个元素,比如说 \(d [ f [ i ] ] = i\) ;

然后就是套路,懂得都懂

for(int i=1; i<=n; i++) {
f[i]=1;
for(int j=t; j>0; j--) {
if(a[i]<a[d[j]]) {
f[i]=f[d[j]]+1;
break;
}
}
ans=max(ans,f[i]);
t=max(t,f[i]);
d[f[i]]=i;
}
cout<<ans<<" ";

第二问

第二问求长度为第一问的 \(ans\) 的下降子序列

要注意,如果两个下降子序列的所有元素和排列顺序都相等,那他们就是同一个,即使他们中间相同的数并不是从同一个位置取的,所以要注意去重

我们开另一个 DP 数组 \(f2 [ i ]\) 记录长度为 \(i\) 的下降子序列的个数

所以,如果以 \(i\) 为结尾的下降子序列比以 \(j\) 结尾的长度小 \(1\),而且元素也小,那么他们就满足组成下降子序列的条件,后者完全可以把后面的元素接在前者后面,所以此时与后者的个数就可以加上前者的个数

int ans2=0
for(int i=1; i<=n; i++) {
if(f[i]==1) f2[i]=1;
for(int j=1; j<i; j++)
if(f[i]==f[j]+1 &&a[i]<a[j])
f2[i]+=f2[j];
}

然后再去重

如果有两个下降序列长度以及元素都相等,就可以把其中一个的个数赋值成 \(0\) ,这样加的时候就不会多加了。

else if(f[i]==f[j] &&a[i]==a[j]) f2[i]=0;

最后再看看与 ans 长度相等的序列个数病输出就好了。

if(f[i]==ans) ans2+=f2[i];

不过,这个题比 P1108 多了一个考察高精度的数据点。

看讨论区有人说 double 可以水,但是我不会。

所以我们打表过那个点。

(如果是在考试时,我们当然不可能打表,但我们也没时间写高精)


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#define maxn 100010
#define maxm 1010
#define int long long using namespace std; int n,a[maxn],f[maxn],t,d[maxn],ans=1;
int f2[maxn]; signed main() {
scanf("%lld",&n);
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
} for(int i=1; i<=n; i++) {
f[i]=1;
for(int j=t; j>0; j--) {
if(a[i]<a[d[j]]) {
f[i]=f[d[j]]+1;
break;
}
}
ans=max(ans,f[i]);
t=max(t,f[i]);
d[f[i]]=i;
}
cout<<ans<<" ";
int ans2=0;
t=0;
for(int i=1; i<=n; i++) {
if(f[i]==1) f2[i]=1;
for(int j=1; j<i; j++)
if(f[i]==f[j]+1 &&a[i]<a[j]) {
f2[i]+=f2[j];
} else if(f[i]==f[j] &&a[i]==a[j]) f2[i]=0;
// ans2=max(ans2,f2[i]);
// t=max(t,f[i]);
// d[f[i]]=i;
// if(ans2==ans) cnt++;
if(f[i]==ans) ans2+=f2[i];
}
if(ans2==0 &&ans==200 &&n==400) {
printf("1606938044258990275541962092341162602522202993782792835301376\n");
return 0 ;
}
cout<<ans2;//
return 0;
}

制作不易,不喜勿喷。

洛谷P2687 & P1108的更多相关文章

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

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

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

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

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  5. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  6. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  7. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  8. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  9. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

随机推荐

  1. @RequestBody,@RequestParam请求数据接收数据

    一. @RequestBody 注解 @RequestBody是用于解析body中的json内容,对于我们使用时候我们需要指定Content-Type参数为application/json,标识我们需 ...

  2. java io 源码研究记录(一)

    Java IO 源码研究: 一.输入流 1  基类 InputStream 简介: 这是Java中所有输入流的基类,它是一个抽象类,下面我们简单来了解一下它的基本方法和抽象方法. 基本方法: publ ...

  3. [LeetCode]147. Insertion Sort List链表排序

    插入排序的基本思想 把排好的放在一个新的变量中,每次拿出新的,排进去 这个新的变量要有超前节点,因为第一个节点可能会有变动 public ListNode insertionSortList(List ...

  4. Mac如何下载软件

    1.App Store  2.软件官网   3.Mac软件网站  4.搜狗微信 个人首选App Store,里面的软件安全可靠,其次就是官网,必不得已才去其他网站下载,毕竟不是App Store或官网 ...

  5. CyclicBarrier(栅栏)的用法详解及与countDownLatch用法区别

    CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行的执行工作,然后在进行下一步步骤之前等待,直至所有任务都完成,它使得所有的并行任务都将在删栏出列队,因此可以一致的向前移动. 当 ...

  6. 2020DevOps状态报告——变更管理

    如果你的公司还没有走向平台化,现在仍然可以是很大的飞跃.您仍然可以通过解决公司的变更管理流程来加快软件交付.在本章中,我们将研究我们在公司内部所学的变更管理模式.我们将向您展示什么是有效的,什么是无效 ...

  7. Flutter 布局类组件:弹性布局(Flex)

    前言 弹性布局允许子组件按照一定比例来分配父容器空间,Flutter中的弹性布局主要通过Flex和Expanded来配合实现. Flex Flex组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方 ...

  8. 9. 细节见真章,Formatter注册中心的设计很讨巧

    目录 本文提纲 版本约定 你好,我是A哥(YourBatman). Spring设计了org.springframework.format.Formatter格式化器接口抽象,对格式化器进行了大一统, ...

  9. redis 5.0.5 安装

    redis 5.0.5 安装脚本: #!/bin/bash cd /data/src/ test -e tcl8.6.9-src.tar.gz || wget http://downloads.sou ...

  10. 跟我一起学Redis之加个哨兵让主从复制更加高可用

    前言 主从复制的实现在上一篇已经分享过,虽然主从复制本身的确让读写分离更加高效,但是对于整体高可用存在很大的劣势:当主节点宕机了之后还需要人为重新进行主从关系配置:这不是开玩笑嘛,这样人为干预,故障恢 ...