洛谷P3146 [USACO16OPEN]248 G
题目传送门
刚刚做完石子合并就来做这个题。读完题之后不假思索的照着石子合并的码略加改动就交了上去,结果:
照着样例和下载的数据点改了一个小时就是不过。于是气急败坏地打开题解才发现
一个隐藏条件:
只有当两个相邻的数相等的时候才能合并!
出题人就不能考虑一下没玩过2048的蒟蒻的感受吗?!
于是我们把正常的石子合并加一个判断条件,即f[i][k]==f[k+1][r]就完美A掉了这道题
AC代码:
#include<bits/stdc++.h>
using namespace std;
int f[305][305];
int main()
{
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i][i]);
ans=max(ans,f[i][i]);
}
for(int i=2;i<=n;i++)
{
for(int j=1;j+i-1<=n;j++)
{
int r=j+i-1;
for(int k=j;k<r;k++)
{
if(f[j][k]==f[k+1][r]&&f[j][k])
{
f[j][r]=max(f[j][k]+1,f[j][r]);
}
}
ans=max(ans,f[j][r]);
}
}
printf("%d\n",ans);
return 0;
}