[USACO16OPEN]248 G
题解
一道区间dp裸题,跟模板题石子合并差不多,但是这里是在玩2048,所以要一样才能合并,而且记录的是出现过的最大值,所以答案不一定是 \(f[1][n]\),因为可能出现无法合并的情况。
转移方程:
\[f[i][j]=max(f[i][j],f[k+1][j]+1)(i \le k < j)
\]
Code:
#include<bits/stdc++.h>
using namespace std;
void read(int &x)
{
char ch=getchar();
int r=0,w=1;
while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
x=r*w;
}
const int N=260;
int a[N],f[N][N],s[N];
int main()
{
int n,ans=0;
read(n);
for(int i=1;i<=n;i++)
read(f[i][i]),ans=max(ans,f[i][i]);
for(int len=2;len<=n;len++)
for(int i=1;i<=n-len+1;i++)
{
int j=i+len-1;
for(int k=i;k<j;k++)
if(f[i][k]==f[k+1][j])
f[i][j]=max(f[i][j],f[k+1][j]+1),ans=max(ans,f[i][j]);
}
cout<<ans;
return 0;
}