BZOJ4580 DP
2317 ワード
とても不思議なDPは1*nの地図を与えて、中で2048を遊んで、毎回隣接する2つの同じ例えばxを合併することができて、xはx+1になります
f[i][x]をiエンディングからxを合成する冒頭がどこに移ったかを表すとしたい
f[i][x]をiエンディングからxを合成する冒頭がどこに移ったかを表すとしたい
#include
#define N 300010
using namespace std;
int n,ans,f[N][61];
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main(){
n=read();
for(int i=1,j,x;i<=n;i++){
x=read();
f[i][x]=i;
j=i-1;
while(f[j][x]){
j=f[j][x++]-1;
f[i][x]=j+1;
}
ans=max(ans,x);
}
printf("%d
",ans);
}