洛谷 P3146 [USACO16OPEN]248 G 区间DP

1×n1\times n 的地图,玩 2048,每次可以合并相邻两个,问合成的最大值。

但是规则和 2048 不同:两个相同的数合并之后得到的值是 +1 后的值,而不是二倍关系。

思路:区间 DP,用 f[i][j]f[i][j] 表示 i,ji,j 之间完全合并后可以得到的最大值,两个区间可以合并当且仅当这两个区间得到的值是相同的,并且不为零。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 300
using namespace std;
int n,a[maxn],f[maxn][maxn],res;
int main(){
#ifdef wine
    freopen("data.in","r",stdin);
#endif
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        f[i][i]=a[i];
    }
    for(int len=2;len<=n;len++)
        for(int i=1;i<n;i++){
            int j=i+len-1;
            if(j>n)break;
            for(int k=i;k<j;k++)
                if(f[i][k]==f[k+1][j]&&f[i][k]!=0)
                    f[i][j]=max(f[i][j],f[i][k]+1);
            res=max(res,f[i][j]);
        }
    printf("%d\n",res);
    return 0;
}
    

posted @ 2020-06-19 12:27  winechord  阅读(72)  评论(0编辑  收藏  举报