Array Shrinking
用dp[i][j].fi
表示连通块的大小,用dp[i][j].se
表示连通块表示的数。
然后再进行动态规划,a[i]
表示从1~i
可以得到的最短长度。
// Created by CAD on 2020/3/9.
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
using namespace std;
pii dp[505][505];
int a[505];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
for(int i=1;i<=n;++i)
cin>>dp[i][i].se,dp[i][i].fi=1;
for(int i=1;i<=n;++i)
for(int j=i;j>=1;--j){
for(int k=i-1;k>=j;--k){
if(dp[k+1][i].se&&dp[j][k].se&&dp[k+1][i].se==dp[j][k].se)
dp[j][i].se=dp[k+1][i].se+1,dp[j][i].fi=dp[k+1][i].fi+dp[j][k].fi;
}
}
for(int i=1;i<=n;++i){
a[i]=a[i-1]+1;
for(int j=i-1;j>=1;--j){
if(dp[j][i].fi) a[i]=min(a[i-dp[j][i].fi]+1,a[i]);
}
}
cout<<a[n]<<"\n";
return 0;
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042