标签:最大 algo include blog 相同 ++ max set i++
LIS变形,最后一个循环i是长度,d[i]存储的是相同长度最小的最后一个元素,也就是啊a[i],然后和
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int maxn=200000+10; int a[maxn],f[maxn],g[maxn]; int d[maxn]; const int inf=0x3f3f3f3f; int t,n; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); memset(d,inf,sizeof(d)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); f[1]=1; for(int i=2;i<=n;i++) { if(a[i]>a[i-1]) f[i]=f[i-1]+1;//上升到a[i]的最大长度 else f[i]=1; } g[n]=1; for(int i=n-1;i>=1;i--) { if(a[i]<a[i+1]) g[i]=g[i+1]+1;//a[i]开始上升的最大长度 else g[i]=1; } int ans=0; for(int i=1;i<=n;i++) { int len=lower_bound(d+1,d+1+i,a[i])-(d+1)+g[i];//g[i]对应a[i],要找到a[i]对应的f[i] ans=max(ans,len); d[f[i]]=min(d[f[i]],a[i]);//更新相同长度的最小a[i],让d[i]=它 } printf("%d\n",ans); } return 0; }
g[i]衔接
标签:最大 algo include blog 相同 ++ max set i++
原文地址:http://www.cnblogs.com/Wangwanxiang/p/6869893.html