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