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. android shape图形优化Button效果

    android shape可以让我们通过定义xml文件的方式创建图形,当然只能实现一些比较简单的图形(圆形,矩形,椭圆,线段),但是已经相当不错了,通过shape创建的图形作为控件的背景已经基本可以满 ...

  2. QMap::remove操作,并不会调用值的析构,跟QTreeWidget同类,需要主动去释放

    void test_MapRemvoe() { DBOperator * painter = new DBOperator; QMap<int , DBOperator*> map; ma ...

  3. Jupyter Notebook使用

    不论你是刚开始学 Python,还是正在啃数据分析的骨头,对你来说,不断在各种命令行窗口和编辑器里切来切去,或者不断打开各种窗口查看 matplotlib 的输出之类的繁琐操作,一定是家常便饭了.哎呀 ...

  4. Java连载36-IDE使用

    一.主方法注意 每一个类都可以编写一个主方法,但是一般情况下,一个系统只有一个入口,所以主方法一般写一个 二.Myeclipse的使用 1.在workspace中工作区中有一个文件夹.metadata ...

  5. QQ音乐2019客户端-获取任意歌单完整歌曲列表和下载音乐文件方法

    步骤 1.在web网站上搜搜任意歌单 https://y.qq.com/#type=index/ 例如:中国好声音4.5.6.7.8季 打开后显示网址:  https://y.qq.com/n/yqq ...

  6. python-10-列表、元组嵌套

    前言 元组.列表前面章节有讲解实例,本节内容是列表.元组的多嵌套. 一.列表嵌套 1.列表嵌套操作1 # 列表的嵌套 li = ['xiaolong', '小林', ['小龙', 'xiaol'], ...

  7. LeetCode 133:克隆图 Clone Graph

    题目: 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). Given a reference of a ...

  8. D3力布图绘制--节点间的多条关系连接线的方法(转)

    在项目中遇到这样的场景,在使用D3.js绘制力布图的过程中,需要在2个节点间绘制多条连接线,找到一个不错的算法,在此分享下. 效果图: HTML中要连接 <!DOCTYPE html> & ...

  9. 【Linux命令】at、crontab定时任务

    crontab定时任务(周期性) 一.简介 通过crontab命令可以在固定的间隔执行系统指令或shell脚本 二.crontab配置文件: Linux下的任务调度分为两类:系统任务调度和用户任务调度 ...

  10. mysql-5.7.23-winx64 解压版详细安装教程

    1.下载解压版: 2.配置环境变量 (1)新建MYSQL_HOME变量,并配置值为: C:\softwaretool\mysql-5.7.23-winx64 计算机→属性→高级系统设置→高级→环境变量 ...