Description

给出一个数列,求出这个序列的最长下降子序列的长度及方案数,子序列中的权值完全相同视为同一个序列

Input

第一行一个整数n,接下来一行n个整数表示序列的权值

Output

一行两个整数分别表示最长的长度及方案数

Sample Input

样例输入1:

12

68 69 54 64 68 64 70 67 78 62 98 87

样例输入2:

3

3 2 2

样例输出1:

4 2

样例输出2:

2 1

HINT

数据范围:

对于20%的数据n <= 10

对于50%的数据n <= 200

对于100%的数据n<= 5000,权值<= 100000,答案不会超出int64(pascal),long long(c++)范围


要求出最长下降子序列长度及方案数是非常容易的. 关键在于去重.

对于去重, 可以从头到尾再DP一次.

第一次DP得到f[i], 即以i为结尾的子串的个数.

第二次DP维护cnt[i], 表示以i为结尾的长度为f[i]的不同子串的个数.

具体维护方法是, j从前往后扫, 至i的位置. 假若有 f[j] == f[i] - 1 且 满足a[j] > a[i], 则将j统计入i的前一位中, 即 cnt[i] += cnt[j]. 对于f[i] == 1的位置, cnt[i]直接赋值为1, 表示有且仅有一种情况, 即为它本身. 至于去重, 假如有 a[j] == a[i] 且 j < i, 则将cnt[j]直接赋值为0, 表示以j为结尾的情况在i中都已经进行累加, 以避免后面重复计算.

这题当时不会写, 只拿了暴力分20, 真的很不应该.

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxN = (int)5e5;
int a[maxN];
int f[maxN];
long long cnt[maxN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("down.in", "r", stdin);
freopen("down.out", "w", stdout);
#endif
int n;
cin >> n;
for(int i = 0; i < n; i ++)
cin >> a[i];
memset(f, 0, sizeof(f));
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < i; j ++)
if(a[j] > a[i])
f[i] = max(f[j] + 1, f[i]);
if(! f[i])
f[i] = 1;
}
for(int i = 0; i < n; i ++)
{
if(f[i] == 1)
cnt[i] = 1;
for(int j = 0; j < i; j ++)
if(a[j] > a[i] && f[j] == f[i] - 1)
cnt[i] += cnt[j];
for(int j = 0; j < i; j ++)
if(f[j] == f[i] && a[j] == a[i])
cnt[j] = 0;
}
long long maxLen = 0, ans = 0;
for(int i = 0; i < n; i ++)
{
if(f[i] > maxLen)
maxLen = f[i], ans = cnt[i];
else if (f[i] == maxLen)
ans += cnt[i];
}
cout << maxLen << ' ' << ans << endl;
}

随机推荐

  1. Ubuntu 15 下 Qt 配置mysql链接及基本操作

    序 最近需要在Linux下做一个unix网络编程项目,选择了Ubuntu 最新版本15.04 : 开发环境:Qt 5 数据库: MySQL 安装Qt 和 MySQL 简要介绍一下软件的安装! 安装Qt ...

  2. nrf开发笔记一开发软件

    nrf52810 的开发环境,比较主流的可以使用keil,iar亦可.sdk中,使用的是pca10040e,s112.虽然开发板共用一个型号(pca10040) keil5中,cmsis 需要4.5. ...

  3. 装饰器与lambda

    装饰器 实际上理解装饰器的作用很简单,在看core python相关章节的时候大概就是这种感觉.只是在实际应用的时候,发现自己很难靠直觉决定如何使用装饰器,特别是带参数的装饰器,于是摊开来思考了一番, ...

  4. studio rendering problems

    问题--------> Rendering Problems The following classes could not be instantiated: - android.support ...

  5. session属性的清除和非法登录

    有的项目会将登录用户的资料存于session的一个属性中,这样方便获取一些数据使用,但是用户退出时需要将session的这个属性清除,一面造成一些不必要的麻烦,但是有些时候,在后台清除了这个属性,在拦 ...

  6. Java-列出所有系统属性

    package com.tj; import java.util.Enumeration; import java.util.Properties; public class MyClass impl ...

  7. 数据库学习网站和linux学习网站

    Oracle ITPub论坛 http://www.itpub.net 著名IT技术论坛.尤以数据库技术闻名. ITPUB论坛的前身应该是建立在 smiling 的 oracle小组,他们搬家前的主页 ...

  8. 如何在官网下载Spring jar包

    该链接里面讲的很仔细! http://blog.csdn.net/frankarmstrong/article/details/69808813

  9. dict的特性和基本语法——python3.6

    特性 key:value结构,字典中的每一个元素,都是键值对 key必须可被hash,且必须为不可变数据类型,必须唯一 可存放任意多个值,可修改,可以不唯一 无序 查找速度快,因为hash可以把key ...

  10. python学习-- {% csrf_token %}

    1.不推荐禁用掉django中的CSRF. 2.我们可以再html页面的form表单中添加csrf_token,带着表单的请求一起发送到服务器去验证. <form  enctype=" ...