给你一个长度为 n(1≤n≤500)n(1≤n≤500) 的数组 aa,每次你可以进行以下两步操作:
-
找到 i∈[1,n)i∈[1,n),使得 ai=ai+1ai=ai+1;
-
将 它们 替换为 ai+1ai+1。
每轮操作之后,显然数组的长度会减小 11,问剩余数组长度的最小值。
#include <iostream> #include<queue> #include <cstring> #define IOS std::ios::sync_with_stdio(0) using namespace std; const int N =550; int a[N],f[N][N],n,num[N][N]; void solve(){ int i,j,k; cin>>n; memset(f,100,sizeof f); for(i=1;i<=n;i++) cin>>a[i],f[i][i]=1,num[i][i]=a[i]; for(int len=2;len<=n;len++) for(i=1;i+len-1<=n;i++){ j=i+len-1; for(k=i;k<j;k++){ f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); if(f[i][k]==1&&f[i][k]==f[k+1][j]&& num[i][k]==num[k+1][j]){ f[i][j]=1,num[i][j]=num[i][k]+1; } } } cout<<f[1][n]<<endl; } signed main(){ IOS; solve(); }