Description

设有一个整数的序列:b1,b2,…,bn,对于下标i1<i2<…<im,若有bi1≤bi2≤…≤bim
则称存在一个长度为m的不下降序列。

现在有n个数,请你求出这n个数的最长不下降序列的长度及有多少个最长不下降序列

Input

第一行为一个整数n (n < 104

第二行有n个整数,数与数之间使用空格间隔

Output

第一行,最长不下降序列的长度

第二行,能构成多少个最长不下降序列(数字相同,位置不同算不同)

Sample Input

7
1 4 3 2 6 5 7

Sample Output

4
 
这道题综合了求最长不降子序列长度和个数,是一道不折不扣的好题。
需要一定的动归基础,0基础同学请自动回避本博客。
 
定义两个数组,dp数组表示以i结尾的最长不降子序列长度,
len数组表示以i结尾的最长不降子序列的个数。
 
我们处理第一问的时候,在输出上加一些处理。
求最长不降子序列的时候,先初始化dp[i]=1;不需要解释。
然后内层循环从1到i-1开始扫。如果符合条件(a[j]<=a[i])
就转移,dp[i]取dp[i]和dp[j]+1的较大值。
这些都不需要解释,。
然后定义标记变量vis,初值一定要设置1。
从头扫,不断更新最长的长度。
最后求出最最最长的长度dp[vis]输出。
 
然后是本题的重头戏。
第二次动归。
首先是初值,初值要设置成1,前提条件是dp[i]得等于1.因为只有长度为1的最长不降子序列的个数是唯一确定的,
然后可以开始扫描了。
这里要注意这个条件,着重着重着重!!!理解!!
dp[j]+1==dp[i]
为什么呢??
注意题面,数字相同位置不同算不同,就是这个意思。
好好理解
然后就可以输出答案了,原理和上面的大同小异。
 
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,ans,vis;
int a[];
int dp[];//表示以i结尾的最长不下降序列的长度。
int len[];//表示以i为结尾的最长不降序列的个数.
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
dp[i]=;
for(int j=;j<i;j++)
if(a[j]<=a[i])
dp[i]=max(dp[j]+,dp[i]);
}
vis=;
for(int i=;i<=n;i++)
if(dp[i]>dp[vis])
vis=i;
printf("%d\n",dp[vis]);
for(int i=;i<=n;i++)
{
if(dp[i]==)
len[i]=;
else
for(int j=;j<i;j++)
if(a[j]<=a[i] && dp[j]+==dp[i])
len[i]+=len[j];
}
for(int i=;i<=n;i++)
if(dp[i]==dp[vis])
ans+=len[i];
printf("%d",ans);
return ;
}

JDOJ 1946 求最长不下降子序列个数的更多相关文章

  1. JDOJ 1929: 求最长不下降序列长度

    JDOJ 1929: 求最长不下降序列长度 JDOJ传送门 Description 设有一个正整数的序列:b1,b2,-,bn,对于下标i1<i2<-<im,若有bi1≤bi2≤-≤ ...

  2. P1020 导弹拦截(nlogn求最长不下降子序列)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  3. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】

    先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...

  4. 求最长不下降子序列(nlogn)

    最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长 ...

  5. Monkey and Banana(dp,求最长的下降子序列)

    A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a bana ...

  6. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...

  7. 最长不下降子序列//序列dp

    最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...

  8. 【tyvj】P1049 最长不下降子序列

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...

  9. 最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

随机推荐

  1. 零基础入门 实战mpvue2.0多端小程序框架

    第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...

  2. CodeForces - 545CWoodcutters

    传送门 题目大意:n棵树(10^5),坐标xi,高度hi,把这棵树砍到,可以向右倒[xi,xi+hi]被占, 向左倒[xi-hi,xi]被占,必须要倒的坐标没有被占才能倒,不砍倒就xi被占,问最多砍几 ...

  3. 正睿暑期培训day3考试

    链接 A 可以发现一个小棍的贡献是使得左右两列上的球位置互换.所以只要找出哪两个球会经过当前位置,然后swap一下就行了.. 考场上调了2.5h,依然没过样例.赛后发现忘了排序!!!!... /* * ...

  4. Paper | Noise2Noise: Learning Image Restoration without Clean Data

    目录 故事背景 算法原理 点估计 神经网络算法与点估计的关系 核心思想 回头品味 实验 高斯 其他生成噪声 发表在2018 ICML. 摘要 We apply basic statistical re ...

  5. guava(四)区间Ranges

    一.构建区间 (a..b) open(C, C) [a..b] closed(C, C) [a..b) closedOpen(C, C) (a..b] openClosed(C, C) (a..+∞) ...

  6. ASP.NET Core 之 Identity 入门(转载)

    原文地址:https://www.cnblogs.com/gongap/p/9504562.html 前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库 ...

  7. Linux 网络通信 API详解【转载】

    TCP/IP分层模型 OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的, 它分为7个层次:应用层.表示层.会话层.传输层.网络层.数据链路层及物理层. 这个7层的协议模型虽然规定得 ...

  8. 关于全局异常(@ControllerAdvice)的学习与思考

    一声梧叶一声秋,一点芭蕉一点愁,三更归梦三更后.____徐再思<水仙子·夜雨> 今天的主题是全局异常的构建,处理,以及一些小细节: 至于全局异常的代码构建以及一些常用的异常处理类可以看这篇 ...

  9. 数据持久化之Data Volume

    废话不多说直接操作 1.启动一个MySQL测试容器 [root@localhost labs]# docker pull mysql #下载MySQL镜像 [root@localhost labs]# ...

  10. kafka中消费者消费消息之每个线程维护一个KafkaConsumer实例

    1.首先启动自己的kafka集群哟. 启动zk: bin/zkServer.sh start conf/zoo.cfg. 验证zk是否启动成功: bin/zkServer.sh status conf ...