给你一个长度为 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();
}
浙公网安备 33010602011771号