题目来源:P3146 [USACO16OPEN] 248 G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这题是对上一节区间dp的巩固:石子合并区间dp-CSDN博客
老规矩先上代码
#include<bits/stdc++.h>
using namespace std;
int dp[1010][1010];
int main()
{
int n;
cin>>n;
int MAX=0;
for(int i=1;i<=n;i++)
{
cin>>dp[i][i];
MAX=max(MAX,dp[i][i]);
}
for(int i=2;i<=n;i++)//枚举区间的长度
{
for(int j=1;j-1+i<=n;j++)//区间的左边界
{
int k=i+j-1;//根据区间长度得出区间的右边界
for(int l=j;l<k;l++)//在这个区间里面选一点
{
if(dp[j][l]==dp[l+1][k]&&dp[j][l])//合并的条件是这两个区间相等,不为零时加1
{
dp[j][k]=max(dp[j][k],dp[j][l]+1);
}
MAX=max(MAX,dp[j][k]);
}
}
}
cout<<MAX;
return 0;
}