** 2213 - 相同数的合并 --- 区间dp
** 来源: 东方博宜oj oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
/*
1,合并相邻两个相同的数
2,注意合并后的数值并非加倍而是+1
求:序列中出现的最大数字的值是多少
合并条件:f[l,k]==f[k+1,r]
f[l,r]=max(f[l,r],f[l][k]+1);
边界条件:
f[i][j]=-∞
f[i][i]=a[i]; //自己这个数合并得到的结果还是自己
*/
const int N=300;
int a[N],f[N][N];
int ans=0,n;
int main()
{
cin>>n;
//初始化
memset(f,-0x3f,sizeof(f));
for(int i=1;i<=n;i++)
{
cin>> a[i];
f[i][i]=a[i];
}
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;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[i][k]+1);
ans=max(ans,f[i][j]);
}
}
}
}
cout<<ans;
return 0;
}
2213 - 相同数的合并 --- 区间dp
最新推荐文章于 2024-09-08 19:37:30 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)