down
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;
}
随机推荐
- python寻找模块的路径顺序
>>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/Versions/3. ...
- OpenStack, kvm, qemu-kvm以及libvirt之关系
OpenStack, kvm, qemu-kvm以及libvirt之关系: KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直 ...
- (转)减少oracle sql回表次数 提高SQL查询性能
要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块. 我们大家都 ...
- studio rendering problems
问题--------> Rendering Problems The following classes could not be instantiated: - android.support ...
- Selenium WebDriver-通过ActionChains实现页面元素拖拽
#encoding=utf-8 import unittest import time import chardet from selenium import webdriver class Visi ...
- Selenium WebDriver-操作键盘事件
# 注意: !!!操作操作系统的按键,需要先装pywin32,然后通过交互模式import win32api和import win32con判断是否安装成功,需要重启下cmd进入交互模式# 下载链接: ...
- Leetcode34--->Search for a Range(在排序数组中找出给定值出现的范围)
题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, ...
- 命令行客户端操作pg数据库常用操作
登录 # su - postgres -c "psql" 或者 $psql -U user_name -d database_name -h serverhost psql (10 ...
- C语言总结(1)
1scanf( )和printf( )属于系统的函数,分别表示输入和输出. 2.所有C语言的程序只有一个main( )函数,从这里开始运行. 3.程序先执行main( ),调用scanf( ),最后输 ...
- git如何忽略文件或者文件夹
用git开发中会有一些不愿意提交的目录或者文件 在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按 ...