BZOJ4580 DP

好神奇的DP
題意 給定一個1*n的地圖,在裏面玩2048,每次可以合併相鄰兩個相同的 例如將x,x合成爲x+1

設f[i][x]表示由i結尾 合成x 的開頭在哪裏
轉移很好想

#include<bits/stdc++.h>
#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\n",ans);  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章