题目链接:https://codeforces.com/problemset/problem/1312/E
题解:由题意可知若一段区间可以合并则最后为一个值,num[i][j]=k,若k!=0表示区间[i,j]可以合并为k,预处理下num[i][j],然后枚举i更新dp[i]的值即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=550;
int n,a[maxn];
int num[maxn][maxn],dp[maxn];
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i),num[i][i]=a[i];
for(int l=1;l<=n;l++){
for(int i=1;i+l<=n;i++){
int j=i+l;
for(int k=i;k<j;k++){
if(num[i][k]==num[k+1][j]&&num[i][k]>0){
num[i][j]=num[i][k]+1;
}
}
}
}
for(int i=1;i<=n;i++){
dp[i]=dp[i-1]+1;
for(int j=1;j<=i;j++)
if(num[j][i]>0)
dp[i]=min(dp[i],dp[j-1]+1);
}
printf("%d\n",dp[n]);
return 0;
}