Luogu[P1108] 低价购买
\(\mathcal{\color{red}{Description}}\)
请你求出一个数列的最长下降子序列长度,并为此求出其方案数。
\]
\(\mathcal{\color{red}{Solution}}\)
乍一看这个复杂度其实是卡死的……如果是\(n^2\)的话,我们的处理规模达到了\(25,000,000\),时限一秒的话……会感到很紧迫\(qwq\),但是的确能跑出来。
我们下来思索,对于最朴素的算法,如果不求方案数的话,是要用\(dp[i]\)表示到第\(i\)位的最长下降子序列长度,我们的纸张算法长这样:
for(i = 1; i <= N; i ++)
for(j = 1; j <= N; j ++){
if (base[i] < base[j]) dp[i] = max(dp[i], dp[j] + 1), ans = max(dp[i], ans);
}
那么,这样的话,对于第二问,我们就可以比较容易地求出方案数,做法是我们对第一问的DP数组再DP一次,就像这样:
for(i = 1; i <= N; i ++){
if(dp[i] == 1) f[i] = 1 ;
for(j = 1; j <= N: j ++)
if(base[i] < base[j] && dp[j] == dp[i] - 1) f[i] += f[j] ;
else if(base[i] == base[j] && dp[j] == dp[i]) f[i] = 0 ;
if(f[i] == ans) res ++ ;
}
嗯,这个应该挺好想的,本蒟唯一想错了的一点是,当时第二层循环里的else后面不应该是--应该是直接置为0才对qwq。
嗯,然后呢这就是\(n^2\)做法。但我一开始写的是\(nlogn\)做法,但是发现\(nlogn\)的话,第二问就不能在第一问的基础上dp了……真是件扫兴的事啊QAQ。
存一波代码\(qwq\)
#include <cstdio>
#include <iostream>
#define MAXN 10010
using namespace std ;
int l, r, mid, i, j, ans ;
int Len = 1, N, base[MAXN], f[MAXN], dp[MAXN] ;
inline int qr(){
int k = 0 ; char c = getchar() ;
while(!isdigit(c)) c = getchar() ;
while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48, c = getchar();
return k ;
}
int main() {
N = qr( ) ;
for(i = 1; i <= N; i ++){base[i] = qr( ); f[i] = 1 ;}
for(i = 1; i <= N; i ++)
for(j = 1; j < i; j ++){
if(base[j] > base[i] && f[i] < f[j] + 1){
f[i] = f[j] + 1 ;
Len = max(Len, f[i]) ;
}
}
cout << Len << " " ;
for(i = 1; i <= N; i ++){
if(f[i] == 1) dp[i] = 1 ;
for(j = 1 ;j < i; j ++){
if(f[i] == f[j] + 1 && base[i] < base[j]) dp[i] += dp[j] ;
if(f[i] == f[j] && base[i] == base[j]) dp[i] = 0 ;
}
if(f[i] == Len) ans += dp[i] ;
}
cout << ans ;
return 0 ;
}
\(Xcode\)写出来的……画风诡异\(emmm\)
Luogu[P1108] 低价购买的更多相关文章
- Luogu P1108 低价购买 DP
第一问求最长下降子序列,不提: 第二问:借鉴了最短路的方法??? 我们求出来了每个位置的最长下降子序列的长度,那么刻意这样这样转移 if f[i]==f[j]+1&&a[i]<a ...
- 洛谷 P1108 低价购买
P1108 低价购买 标签 动态规划 难度 提高+/省选- 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:& ...
- 洛谷 P1108 低价购买 解题报告
P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买&quo ...
- P1108 低价购买 (DP)
题目 P1108 低价购买 解析 这题做的我身心俱惫,差点自闭. 当我WA了N发后,终于明白了这句话的意思 当二种方案"看起来一样"时(就是说它们构成的价格队列一样的时候),这2种 ...
- P1108 低价购买——最长下降子序列+方案数
P1108 低价购买 最长下降子序列不用多讲:关键是方案数: 在求出f[i]时,我们可以比较前面的f[j]; 如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重: ...
- P1108 低价购买(DP)
题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷P1108 低价购买
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷P1108 低价购买题解
看到"你必须用低于你上次购买它的价格购买它",有没有想到什么?没错,又是LIS,倒过来的LIS,所以我们只要把读入的序列倒过来就可以求LIS了,第一问解决. 首先要厘清的是,对于这 ...
随机推荐
- P1025[SCOI2009]游戏
windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按 顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对应的数字.然后又在新的 ...
- 记录LNMP环境彻底删除绑定域名及网站文件夹/文件的过程
lnmp vhost del #删除绑定的域名 chattr -i /home/wwwroot/域名文件夹/.user.ini #解除文件安全限制 rm -rf /home/wwwroot/域名文件夹 ...
- Laravel基本使用
laravel一.简介二.运行环境要求 1.php 版本>=5.5.9 2.Mcrypt PHP扩展 php的加密扩展,提供多种加密算法 3.openssl扩展 对传输的数据进行加密 4.mbs ...
- Leetcode算法比赛----First Unique Character in a String
问题描述 Given a string, find the first non-repeating character in it and return it's index. If it doesn ...
- Raspberry install wine
sudo apt install wine winecfg出现问题 树莓派3B是卡片电脑,内存为1GB,一般运行Linux.Linux两种主流的内存分配方法2G/2G和3G/1G,树莓派系统后期优化性 ...
- spring mvc拦截器HandlerInterceptor
本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterce ...
- new era
新的博客,将会记录我在工作和学习中遇到的问题以及总结...
- Windows Server 2008 R2 /2012 修改密码策略(摘抄 原文地址 https://www.cnblogs.com/mili3/p/7799347.html)
今天建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点. 问题: 在“管理工具 >> 本地安全策略 > ...
- [翻译] JTSlideShadowAnimation
JTSlideShadowAnimation 效果图: JTSlideShadowAnimation allow you to reproduce the famous "slide to ...
- 乘风破浪:LeetCode真题_020_Valid Parentheses
乘风破浪:LeetCode真题_020_Valid Parentheses 一.前言 下面开始堆栈方面的问题了,堆栈的操作基本上有压栈,出栈,判断栈空等等,虽然很简单,但是非常有意义. 二.Valid ...