題目連接:點這裏c++
設\(f[i][j]\)表示以j爲左端點,合併後最大值爲i的序列的右端點的位置git
那麼咱們能夠獲得狀態轉移方程\(f[i][j]=f[i-1][f[i-1][j]+1]\)spa
由於\(N\le262144\),因此i最大可能爲58,那麼咱們枚舉便可code
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=262146; int n,ans,f[59][N]; int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();} while(isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f; } int main(){ n=read();for(int i=1;i<=n;i++) f[read()][i]=i; for(int i=1;i<=58;i++) for(int j=1;j<=n;j++){ !f[i][j]&&f[i-1][j]&&(f[i][j]=f[i-1][f[i-1][j]+1]); f[i][j]?ans=i:0; }printf("%d\n",ans); return 0; }