P3147 262144
题面:https://www.luogu.org/problemnew/show/P3147
本题设f[i][j]表示左端点为j,能合并出i这个数字的右端点的位置
由于位置为j的数和位置为f[i-1][j]的数可以合成一个i-1
那么位置为f[i-1][j]的数和位置为f[i-1][f[i-1][j]]的数也可以合成一个i-1
那么这样就可以合成一个i了
所以就有了f[i][j]=f[i−1][f[i−1][j]]
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=270000,M=65;
long long n,a,i,j,f[M][N],ans;
int main(){
cin>>n;
for(i=1;i<=n;i++){
cin>>a;
f[a][i]=i+1;
}
for(i=2;i<=60;i++){
for(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;
//system("pause");
exit(0);
}