提交时间:2024-11-26 14:50:08
运行 ID: 35048
#include<bits/stdc++.h> using namespace std; int n,a[20010],c[200010],ptot,p[2010]; short dp[1<<(26)]; vector<int> sta[30]; int popcount(int x){ int cnt=0; while(x){ cnt=cnt+(x&1); x>>=1; }return cnt; }int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; c[i]=a[i]-a[i-1]; }c[n+1]=-a[n]; for(int i=1;i<=n+1;i++){ if(c[i]!=0){ p[++ptot]=c[i]; } }for(int i=1;i<(1<<ptot);i++){ sta[popcount(i)].push_back(i); }for(int len=1;len<=ptot;len++){ for(auto nowsta:sta[len]){ int nowsum=0; for(int i=1;i<=ptot;i++){ if(((1<<(i-1))&nowsta)!=0){ nowsum+=p[i]; } }for(int j=1;j<=ptot;j++){ if(((1<<(j-1))&nowsta)==0){ if(nowsum+p[j]==0){ dp[(1<<(j-1))|nowsta]=max(dp[nowsta]+1,dp[(1<<(j-1))|nowsta]); }else{ dp[(1<<(j-1))|nowsta]=max(dp[nowsta],dp[(1<<(j-1))|nowsta]); } } } } }cout<<ptot-dp[(1<<ptot)-1]<<'\n'; }