BZOJ4580 DP

2317 ワード

とても不思議なDPは1*nの地図を与えて、中で2048を遊んで、毎回隣接する2つの同じ例えばxを合併することができて、xはx+1になります
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); }