洛谷 P1108 低价购买(LIS,统计方案数)
传送门
解题思路
看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求?
注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方案被认为是相同的。
这里就用到了一种基于dp的dp。
我们用a[i]存原来的数,f[i]存以第i个数结尾的最长下降子序列的长度,t[i]存以i结尾的最长下降子序列的方案数。
f[i]照常求,那么t[i]不能重复,怎么求呢?
首先,对于每一个i,枚举j=1...i-1。
- 若f[i]==f[j]且a[i]==a[j],这时f[i]的方案数是>=f[j]的,因为题目要求不能重复,所以我们把较小的那个t[j]定为0,t[i]不变,继续求。
- 若f[i]=f[j]+1且a[i]<a[j],也就是说f[j]这个序列的最后可以加上a[i]这个数,所以这时t[i]+=t[j],继承过t[i]的方案数。
最后,如果t[i]还是等于0,那么代表着a[i]不能成为任何一个序列的最后一个数,说明a[i]是到目前为止的最大的数,这时t[i]赋值为1。
最后统计出答案即可。
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=;
int a[maxn],f[maxn],t[maxn];
//a[i]存原来的数,f[i]存以第i个数结尾的最长下降子序列的长度,
//t[i]存以i结尾的最长下降子序列的方案数
int n,maxf;
long long ans;
int main()
{
cin>>n;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
if(a[i]<a[j]) f[i]=max(f[i],f[j]+);
}
if(f[i]==) f[i]=;
maxf=max(maxf,f[i]);
for(int j=;j<i;j++){
if(f[i]==f[j]&&a[i]==a[j]){
t[j]=;
}
if(f[i]==f[j]+&&a[i]<a[j]){
t[i]+=t[j];
}
}
if(t[i]==) t[i]=;
}
for(int i=;i<=n;i++){
if(f[i]==maxf) ans+=t[i];
}
cout<<maxf<<" "<<ans;
return ;
}
洛谷 P1108 低价购买(LIS,统计方案数)的更多相关文章
- 洛谷P1108 低价购买[DP | LIS方案数]
		题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ... 
- 洛谷 P1108 低价购买 解题报告
		P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买&quo ... 
- 洛谷 P1108 低价购买
		P1108 低价购买 标签 动态规划 难度 提高+/省选- 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:& ... 
- 洛谷P1108 低价购买
		题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ... 
- 洛谷P1108 低价购买 (最长下降子序列方案数)(int,long long等 范围)
		这道题用n方的算法会很好做 我一开始想的是nlogn的算法求方案数, 然后没有什么想法(实际上也可以做,但是我太弱了)我们就可以根据转移方程来推方案数,只是把max改成加,很多动规题 都是这样,比如背 ... 
- 洛谷P1108 低价购买题解
		看到"你必须用低于你上次购买它的价格购买它",有没有想到什么?没错,又是LIS,倒过来的LIS,所以我们只要把读入的序列倒过来就可以求LIS了,第一问解决. 首先要厘清的是,对于这 ... 
- P1108 低价购买——最长下降子序列+方案数
		P1108 低价购买 最长下降子序列不用多讲:关键是方案数: 在求出f[i]时,我们可以比较前面的f[j]; 如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重: ... 
- P1108 低价购买 (DP)
		题目 P1108 低价购买 解析 这题做的我身心俱惫,差点自闭. 当我WA了N发后,终于明白了这句话的意思 当二种方案"看起来一样"时(就是说它们构成的价格队列一样的时候),这2种 ... 
- P1108 低价购买(DP)
		题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股 ... 
随机推荐
- fs.mkdir
			fs.mkdir(path[, mode], callback) 要求父目录必须存在 let fs = require('fs'); fs.mkdir('./c/b/a', res=>{ // ... 
- USB-TTL
- H5 FileReader对象
			前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件. input:file 在介绍FileReader之前,先简单介绍input的file类型. < ... 
- day03记 angular代码
			一.AngularJs AngularJS 是一个 JavaScript 框架.通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML. 1.四大特征 MVC模式.模块化.自动化双向数据绑 ... 
- 如何编译Java程序以及运行程序
			一.编辑运行 二.HelloWorld程序的组成: 三.public static void main(String[] args){} 四.System.out.println("Hell ... 
- Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题。 就好比我来说,我两个都用。我深知这两个平台的优缺点。所以,我决定分享我关于这两个移动平台的观点。另外,然后谈谈我对新的 Ubuntu 移动平台的印象和它的优势。  IOS 的优点  虽然这些天我是个十足的 Android 用户,但我必须承认 IOS 在某些方面做的是不错。首先,苹果公司在他们的设备更新方面有更
			Android与IOS的优缺点比较 对 Android 与 IOS 比较是个个人的问题. 就好比我来说,我两个都用.我深知这两个平台的优缺点.所以,我决定分享我关于这两个移动平台的观点.另外,然后谈谈 ... 
- HDU 2296 Ring ( Trie图 && DP && DP状态记录)
			题意 : 给出 m 个单词,每一个单词有一个权重,如果一个字符串包含了这些单词,那么意味着这个字符串拥有了其权重,问你构成长度为 n 且权重最大的字符串是什么 ( 若有权重相同的,则输出最短且字典序最 ... 
- es之java插入优化(批量插入)
			插入文档操作的一种优化,因为每次插入单条文档,都会向es中发送请求.然后es执行在返回结果: 如果有大批量的文档数据需要插入,这个时候单挑插入操作显然是不合理的: 之前学习的命令行批量执行方式: PO ... 
- 测试常用linux命令1
			进程相关: 1,查看所有进程(包含历史进程): ps -ef 各个参数的含义依次是uid,pid,ppid,c(cpu利用率),stime(进程启动时间),tty,time,cmd 2,动态查看进程t ... 
- CentOS和Windows互相远程桌面方法
			https://blog.csdn.net/libaineu2004/article/details/49407883 
