Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35060 | liuziming | 【S】T1 | C++ | 内存超限 | 95 | 2991 MS | 551340 KB | 1191 | 2024-11-26 15:11:13 |
#include<bits/stdc++.h> using namespace std; int n,a[20010],c[200010],ptot,p[2010],sum[1<<(25)]; short dp[1<<(25)],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+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(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'; }