题目描述
给你 n ( 2 ≤ n ≤ 248 ) n(2\le n\le 248) n(2≤n≤248) 个数,每次可以将两个相邻的相同数 x x x 合并成 x + 1 x+1 x+1,求最大能合出多少。
算法分析
简单的区间DP,cstring
,cstring
,cstring
!!!
代码实现
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn=300;
int f[maxn][maxn];
int main() {
int n;scanf("%d",&n);
memset(f,0xc0,sizeof(f));
for(int i=1;i<=n;++i) scanf("%d",&f[i][i]);
for(int l=2;l<=n;++l) {
for(int i=1,j=i+l-1;(j=i+l-1)<=n;++i) {
for(int k=i;k<j;++k) if(f[i][k]==f[k+1][j]) {
f[i][j]=std::max(f[i][j],f[i][k]+1);
}
}
}
int ans=0xc0c0c0c0;
for(int i=1;i<=n;++i)
for(int j=i;j<=n;++j)
ans=std::max(ans,f[i][j]);
printf("%d\n",ans);
return 0;
}