关于lis的方案数
求lis的时候呢,我想n^2的做法是很简单的,二分的话除了最长不上升或最长不下降子序列不好求之外(毕竟要注意细节)于是从中发现了,求lis真正的序列也是十分不好求出的尤其是字典序最大的不上升序列了,什么的很难求的,当时好像打了hash,玄学找起点,优先队列维护。等等,可能不是很好的思路吧。
但是求方案数就不一样了并不需要一些堆什么的维护。多开一个数组在dp的时候进行维护即可我是这样想的并不是所有的方案数都是乘法原理,加法原理是乘法原理的分支,不能光想着乘法。
下面给出例题求不同的lis方案数。
这道题呢第一问很简单的,求一个最长下降子序列即可而且还不算相同的数字,数据范围5000 n^2当然也是可以过得。所以关键是第二问。
问的是不相同的最长下降子序列有多少种,这个问题让我感觉难以回答,尽管看完题解后恍然大悟,但是刚碰到的时候还是免不了想起了暴力,乘法原理什么的。
这里题解上给出的正解是维护一个t数组表示以第i个数子为结尾的最长下降子序列的方案数,尽管它可能不是答案但是对答案的累加做出了极大的贡献所以需要维护一下。
那么则有另一个状态转移方程了。f[i]==f[j]&&a[i]==a[j]?t[j]=0:0; f[i]==f[j]+1&&a[i]<a[j]?t[i]+=t[j]:0;其中1=<j<i;
这样就维护好了t数组,所以接下来就完事了,仔细思考上述第一个状态转移。如果当前的数字相等和长度都相等的话那么,就一定是完全相同的序列那么前一个对答案就做不出任何贡献了,因为答案要的是不相同的方案数。
code:
#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<string>
#include<set>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cctype>
#include<utility>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
inline long long read()
{
long long x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void put(long long x)
{
x<?x=-x,putchar('-'):;
long long num=;char ch[];
while(x)ch[++num]=x%+'',x/=;
num==?putchar(''):;
while(num)putchar(ch[num--]);
putchar(' ');return;
}
const int MAXN=;
int n;
int a[MAXN],f[MAXN];
int ans=,cnt=;
int c[MAXN];
int main()
{
//freopen("1.in","r",stdin);
n=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<=n;i++)
{
f[i]++;
for(int j=;j<i;j++)if(a[j]>a[i])f[i]=max(f[i],f[j]+);
ans=max(ans,f[i]);
for(int j=;j<i;j++)
{
if(a[i]==a[j]&&f[j]==f[i])c[j]=;
if(a[i]<a[j]&&f[j]+==f[i])c[i]+=c[j];
}
c[i]==?c[i]=:;
}
put(ans);
for(int i=;i<=n;i++)if(f[i]==ans)cnt+=c[i];
put(cnt);
return ;
}
显然算法的复杂度是n^2的所以,为了追求更完美,好吧我也不是完美主义者,不是很想写了。那就这样吧。
关于lis的方案数的更多相关文章
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P1108 低价购买(LIS,统计方案数)
传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一 ...
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- NOIP2012pj摆花[DP 多重背包方案数]
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- UVa 11137 (完全背包方案数) Ingenuous Cubrency
题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...
- 删数方案数(regex)
[题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同 ...
- poj2975 Nim 胜利的方案数
Nim Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5545 Accepted: 2597 Description N ...
- ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」
传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...
- P2347 砝码称重-DP方案数-bitset
P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...
随机推荐
- vue设置默认地址和配送方式
1.截图 2.address.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- Android 录音和播放
今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来.所以了解了一些有关录音和播放的知识.接到这个任务的第一反应就是看看Andro ...
- 编写自定义Yeoman生成器简述
1. 安装生成器Yeoman提供了generator-generator方便快速编写自己的生成器. 安装: npm install -g generator-generator运行: yo gener ...
- IOS Swift 训练
// Playground - noun: a place where people can play import Cocoa var str = "Hello, playground&q ...
- openssl 非对称加密DSA,RSA区别与使用介绍
在日常系统管理工作中,需要作一些加解密的工作,通过openssl工具包就能完成我们很多需求! 1. openssl RSA 加解密 RSA是基于数论中大素数的乘积难分解理论上的非对称加密法,使用公私钥 ...
- Java知多少(47)多重catch语句的使用
某些情况,由单个代码段可能引起多个异常.处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常.当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行.当 ...
- azkaban在centos下的部署安装
azkaban 是一个用Java开发的开源调度工具workflow. 下面介绍具体安装过程,我这里使用的版本是3.43.0,使用的是solo运行模式. 编译 git clone https://git ...
- C++ 智能指针二
/* 智能指针shared_ptr注意点 */ #include <iostream> #include <string> #include <memory> // ...
- 生产环境使用nginx做负载均衡配置的五种策略
nginx的upstream目前支持5种方式的分配1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weight和访 ...
- Centos7 安装PHP7版本及php-fpm,redis ,php-redis,hiredis,swoole 扩展安装
============================PHP7.1 ========================================= 1. 更换rpm 源,执行下面两个 rpm - ...