


解题思路
这题区间dp用的很妙。我们先用dp数组存储区间内能合并的值,如果无法合并存为-1。之后再用线性dp记录前iii个数能合并的最小值。
AC Code
cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int n,a[maxn],f[maxn],dp[maxn][maxn];
int main(){
cin>>n;
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++) {
cin>>a[i];
dp[i][i]=a[i];
}
for(int lenn=2;lenn<=n;lenn++){
for(int l=1,r=lenn+l-1;r<=n;l++,r++){
dp[l][r]=-1;
for(int k=l;k<r;k++)
if(dp[l][k]==dp[k+1][r]&&dp[l][k]!=-1)
dp[l][r]=dp[l][k]+1;
}
}
for(int i=1;i<=n;i++){
if(dp[1][i]>-1){
f[i]=1;
continue;
}
f[i]=f[i-1]+1;
for(int j=1;j<i-1;j++){
if(dp[j+1][i]>-1) f[i]=min(f[i],f[j]+1);
}
}
cout<<f[n];
return 0;
}