題目鏈接:https://codeforces.ml/contest/1312/problem/E
題目大意:給你一個數組,兩個相鄰的相同元素X可以合併成一個元素X+1。可以無限次合併。問最後數組剩餘的最少元素。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int a[505], f[505], dp[505];
vector<int> v[505];
int main() {
int n; scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
f[i]=i; dp[i]=i;
}
for(int l=1; l<=n; l++){
stack<int> s;
for(int r=l; r<=n; r++){
int pos=a[r];
while(!s.empty()&&s.top()==pos){
s.pop(); pos++;
}
s.push(pos);
if(s.size()==1){
v[r].push_back(l);
}
}
}
for(int i=1; i<=n; i++){
for(int j=0; j<v[i].size(); j++){
dp[i]=min(dp[i], dp[v[i][j]-1]+1);
}
}
cout<<dp[n]<<endl;
return 0;
}