洛谷 P3146 [USACO16OPEN]248 G 区间DP
给 的地图,玩 2048,每次可以合并相邻两个,问合成的最大值。
但是规则和 2048 不同:两个相同的数合并之后得到的值是 +1 后的值,而不是二倍关系。
思路:区间 DP,用 表示 之间完全合并后可以得到的最大值,两个区间可以合并当且仅当这两个区间得到的值是相同的,并且不为零。
#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;
}