博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于lis的方案数
阅读量:4922 次
发布时间:2019-06-11

本文共 1742 字,大约阅读时间需要 5 分钟。

  求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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;inline long long read(){ long long x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}inline void put(long long x){ x<0?x=-x,putchar('-'):0; long long num=0;char ch[50]; while(x)ch[++num]=x%10+'0',x/=10; num==0?putchar('0'):0; while(num)putchar(ch[num--]); putchar(' ');return;}const int MAXN=5002;int n;int a[MAXN],f[MAXN];int ans=0,cnt=0;int c[MAXN];int main(){ //freopen("1.in","r",stdin); n=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++) { f[i]++; for(int j=1;j
a[i])f[i]=max(f[i],f[j]+1); ans=max(ans,f[i]); for(int j=1;j
View Code

显然算法的复杂度是n^2的所以,为了追求更完美,好吧我也不是完美主义者,不是很想写了。那就这样吧。

 

转载于:https://www.cnblogs.com/chdy/p/10239911.html

你可能感兴趣的文章
弹窗组价
查看>>
小程序の填坑指北
查看>>
AutoMutex
查看>>
13 -1 BOM和定时器
查看>>
uuid.go
查看>>
c#中怎么删除一个非空目录
查看>>
selenium java-2 chrome driver与对应版本
查看>>
javascript的私有机制
查看>>
arguments对象疑惑
查看>>
MyEclipse 的代码提示功能
查看>>
作为开发人员,我们实在是太幸运
查看>>
对比<input type="text" id="">和<asp:TextBox runat="server" ID="">
查看>>
20145203盖泽双 《Java程序设计》第8周学习总结
查看>>
percona-toolkit大表操作DDL使用
查看>>
【c++手记】Copy Constructor
查看>>
调用第三方物流公司API即时查询物流信息
查看>>
classifier in maven
查看>>
Jetson TX2介绍
查看>>
意见汇总
查看>>
【Golang 接口自动化07】struct转map的三种方式
查看>>