262144

262144_第1张图片
262144_第2张图片
考虑一个序列

262144_第3张图片
设f[i][j]是以j为结尾,是否能生成一个长度为i的序列
当f[i][j]=0时
是以j为结尾的序列生成不了一个长度为i的序列
当f[i][j]>0时
是以j为结尾的序列能生成一个长度为i的序列,且f[i][j]要存k,k是这个长度为i的序列最前面的坐标-1
262144_第4张图片
所以我们可以推出
f[i][j]=f[i-f[i][j-1]][j-1]
i-1 a[i]==j

#include
using namespace std;
int n,f[60][262155],ans;
int main()
{
 cin>>n;
 for(int i=1;i<=n;i++)
 {
  int x;
  cin>>x;
  f[x][i]=i+1;
 }
 for(int i=2;i<=58;i++)
 {
  for(int j=1;j<=n;j++)
  {
   if(!f[i][j]) 
    f[i][j]=f[i-1][f[i-1][j]];
   if(f[i][j]) 
    ans=i;
  }
 }
 cout<<ans<<endl;
 return 0;  
}

你可能感兴趣的:(zr,B)