提交时间:2024-11-26 15:10:08
运行 ID: 35058
#include<bits/stdc++.h> using namespace std; int n,a[20010],c[200010],ptot,p[2010],sum[1<<(26)]; short dp[1<<(26)],qwp;int nowsum=0; vector<int> sta[30]; inline int popcount(int x){ register 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;i++){ if(c[i]!=0){ p[++ptot]=c[i]; } }for(int i=1;i<(1<<ptot);i++){ sta[popcount(i)].push_back(i); for(register int j=1;j<=ptot;j++){ if(((1<<(j-1))&i)!=0){ sum[i]+=p[j]; } } }for(int len=1;len<=ptot;len++){ for(int nowsta:sta[len]){ //nowsum=0; for(register int ss=nowsta,j=(ss&(-ss));ss;ss-=j,j=(ss&(-ss))){ if(sum[nowsta]==0){ qwp=dp[nowsta-j]+1; dp[nowsta]=max(dp[nowsta],qwp); }else{ dp[nowsta]=max(dp[nowsta],dp[nowsta-j]); } } } }cout<<ptot-dp[(1<<ptot)-1]<<'\n'; }