这道题可以考虑用DP的思路,我们设f[i][j]为从第i个数字开始,合成数字j所需要的数字之后数字的位置。比如数据(1,2,2,3)中,f[2][4]=5,f[2][3]=4。
则我们可以发现f[i][j]=f[f[i][j-1]][j-1]。
所以我们用bool型DP进行判断即可。
using namespace std;
int i,j,k,n,m,tot,ans;
int f[270000][60];
int read(){
char c;int x;while(c=getchar(),c<'0'||c>'9');x=c-'0';
while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';return x;
}
int main()
{
n=read();
for(int i=1;i<=n;i++){
int x=read();f[i][x]=i+1;
}
for(int j=2;j<=58;j++)
for(int i=1;i<=n;i++){
if(!f[i][j]) f[i][j]=f[f[i][j-1]][j-1];
if(f[i][j]) ans=j;
}
printf("%d",ans);
return 0;
}