题目大意:给定一个有 N 个数的序列,求其最长下降子序列的长度,并求出有多少种不同的最长下降子序列。(子序列各项数值相同视为同一种)

update at 2019.4.3

题解:求最长下降子序列本身并不难,是一道非常经典的线性dp问题,关键在于dp计数部分。这道题跟一般的状态转移计数不同,这里并不是按照状态去计数,对于状态来说不会有重复的情况发生。

考虑何时会产生答案重叠。对于序列中两个值相同的元素 \(a_i,a_j,(j<i)\),到 i 之前的序列被这两个相同的元素分成了两部分,即:小于 j 的序列(第一部分)和大于 j 小于 i 的序列(第二部分)。下面分情况进行讨论。

  1. 第二部分对 dp[i] 没有产生任何贡献,即:第二部分的元素值都小于 a[i],此时发现 a[i] 和 a[j] 完全等价,因此 i 的答案贡献应该为 0。
  2. 第二部分对 dp[i] 产生了贡献,且 dp[i]>dp[j],这时 i 和 j 的序列显然不会有重叠的概念,毕竟都不一样长嘛qwq。
  3. 第二部分对 dp[i] 产生了贡献,且 dp[i]=dp[j],比如序列 1 3 4 2 4,这时,对于第一个 4 之前的答案种数对 i 忽略不计即可,不过第二部分对 i 的种数贡献需要计入 f[i]。

代码如下

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=5010;
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){
ll x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
/*--------------------------------------------------------*/ int n,a[maxn];
int dp[maxn],f[maxn],ans1,ans2; void read_and_parse(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
} void solve(){
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++)if(a[j]>a[i])dp[i]=max(dp[i],dp[j]+1);
ans1=max(ans1,dp[i]);
}
for(int i=1;i<=n;i++){
if(dp[i]==1)f[i]=1;
for(int j=1;j<i;j++)
if(a[j]>a[i]&&dp[i]==dp[j]+1)f[i]+=f[j];
else if(a[i]==a[j]&&dp[i]==dp[j])f[i]=0;
if(dp[i]==ans1)ans2+=f[i];
}
printf("%d %d\n",ans1,ans2);
} int main(){
read_and_parse();
solve();
return 0;
}

【POJ1952】逢低吸纳 dp+计数的更多相关文章

  1. Usaco 4.3.1 Buy Low, Buy Lower 逢低吸纳详细解题报告

    问题描述: "逢低吸纳"是炒股的一条成功秘诀.如果你想成为一个成功的投资者,就要遵守这条秘诀:  "逢低吸纳,越低越买"  这句话的意思是:每次你购买股票时的股 ...

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

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

  3. [USACO4.3]逢低吸纳Buy Low, Buy Lower

    https://daniu.luogu.org/problemnew/show/2687 求方案数: if(f[j]+1==f[i] && a[j]>a[i]) s[i]+=s[ ...

  4. 动态规划(DP计数):HDU 5116 Everlasting L

    Matt loves letter L.A point set P is (a, b)-L if and only if there exists x, y satisfying:P = {(x, y ...

  5. Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)

    题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...

  6. HDU 4055 The King’s Ups and Downs(DP计数)

    题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...

  7. HDU 4055 Number String(DP计数)

    题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...

  8. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  9. 动态规划(DP计数):HDU 5117 Fluorescent

    Matt, a famous adventurer who once defeated a pack of dire wolves alone, found a lost court. Matt fi ...

随机推荐

  1. [UWP 自定义控件]了解模板化控件(5):VisualState

    1. 功能需求 使用TemplatePart实现上篇文章的两个需求(Header为空时隐藏HeaderContentPresenter,鼠标没有放在控件上时HeaderContentPresent半透 ...

  2. OpenGL学习(1)——创建窗口

    这是我的第一篇博客,试着记录学习OpenGL的过程.使用的教程:LearnOpenGL,系统:Deepin 15.9.3,IDE:Qt Creator. 添加头文件 创建窗口用到两个库:GLFW和GL ...

  3. Vue 回顾之指令(关于input自动聚焦的问题)

    用了Vue也一年多了,虽然对大部分内容都比较熟悉,但有些用法可能会起到意想不到的作用. 今天在做一个关于抽奖的需求,要求是每次点击编辑按钮显示编辑框,要求自动聚焦. 一开始想到了autofocus属性 ...

  4. linux-shell-引用-命令替换-命令退出状态-逻辑操作符

    命令替换:bash7步扩展的之一 嵌套  这里没什么意义 退出状态可以参与逻辑判断 表达式 算数表达式和条件表达式,逻辑表达式 查看passwd命令比,避免用户捕获输入密码的接口 这种方式就可以直接输 ...

  5. 20135327郭皓--Linux内核分析第七周 可执行程序的装载

    第七周 可执行程序的装载 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ...

  6. beanutils的使用

    在项目进行中,使用到beanutils时发现1.9.X以上版本搭配logging搭配使用用不了,实在搞不明白.----stackoverflow提问吧 BeanUtils工具由Apache软件基金组织 ...

  7. Estimating the number of receiving nodes in 802.11 networks via machine learning

    来源:IEEE International Conference on Communications 作者:Matteo Maria 年份:2016 摘要: 现如今很多移动设备都配有多个无线接口,比如 ...

  8. 用IntelliJ IDEA编译,编译之后提示 无效的标记: -release

    软件版本:ideaIU-2016.3.2 JDK:jdk-9.0.4_windows-x64_bin 开始的时候建立一个maven项目,发现编译的时候提示[无效的标记: -release],以为是项目 ...

  9. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  10. laravel5 报错419,form 添加crrf_field 后让然失败,本地环境配置问题

    这个是因为laravel自带CSRF验证的问题 解决方法 方法一:去关掉laravel的csrf验证,但这个人不建议,方法也不写出来了. 方法二:把该接口写到api.php上就好了 方法三: 首先在页 ...