模板求最长不下降序列 [动态规划 LIs]
Posted lxyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板求最长不下降序列 [动态规划 LIs]相关的知识,希望对你有一定的参考价值。
看不出来哪里还错了.....
d[i]以i为结尾的最长上升子序列的长度 g[i]表示d值为i的最小状态的编号即长度为i的上升子序列的最小末尾值(d[j]=i的j值最小)
liurujia‘s
for(int i=1;i<=n;++i) g[i]=inf;
for(int i=1;i<=n;++i)
int k=lower_buond(g+1,g+1+n,a[i])-g;
d[i]=k;
g[k]=a[i];
二昏好难啊.....
贴上90昏代码....
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define Max(x,y) (x)>(y)?(x):(y) #define Min(x,y) (x)>(y)?(y):(x) #define ll long long #define rg register const int N=200+5,M=200000+5,inf=0x3f3f3f3f,P=99999997; int n,a[N],g[N],ans=0; template <class t>void rd(t &x) x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch==‘-‘,ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x; int main() // freopen("in.txt","r",stdin); rd(n); for(int i=1;i<=n;++i) rd(a[i]); memset(g,inf,sizeof(g)); for(int i=1;i<=n;++i) int k=lower_bound(g+1,g+1+n,a[i])-g; g[k]=a[i]; ans=max(ans,k); printf("max=%d\n",ans); for(int i=1;i<=ans;++i) printf("%d ",g[i]); return 0;
以上是关于模板求最长不下降序列 [动态规划 LIs]的主要内容,如果未能解决你的问题,请参考以下文章