chen_qian
2021-01-31 20:51:40
题目链接
这里有一个性质,就是对于一个区间
知道了这个结论,我们要做就是,确定一个区间是否能合并成一个数,如果能,那么这个数是多少?
假设这个区间是
1.将这个数作为
2.将其作为
这里显然使用后者。所以设
那么就有
#include<bits/stdc++.h>
#define N 505
using namespace std;
int n,f[N][N],a[N];
int dp[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) f[i][i]=a[i];
for(int len=2;len<=n;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
for(int i=l;i<r;i++)
if(f[l][i]&&f[l][i]==f[i+1][r]) f[l][r]=f[l][i]+1;
}
}
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(f[j][i]) dp[i]=min(dp[j-1]+1,dp[i]);
}
}
printf("%d",dp[n]);
return 0;
}
总结:
对于比较难的