Ural2110 : Remove or Maximize
设最大的数为w,若n>k+logw,那么显然所有1都可以保留,否则现在n≤k+logw。
如果w≤100000,那么可以DP,设f[i][j]表示考虑前i个数,保留的数的or是j时,最多能删除多少个数,时间复杂度O(nw)。
如果w>100000,那么k≤7,爆搜即可,时间复杂度O(C(n,k))。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include<cstdio> #include<algorithm> using namespace std; const int N=100010; int n,m,i,j,o,ans,mx,f[2][131100],a[N]; void dfs( int x, int y, int z){ if (y+n-x+1<m) return ; if (x>n){ ans=max(ans,z); return ; } dfs(x+1,y,z|a[x]); if (y<m)dfs(x+1,y+1,z); } int main(){ scanf ( "%d%d" ,&n,&m); for (i=1;i<=n;i++) scanf ( "%d" ,&a[i]),mx=max(mx,a[i]); if (n>m+31){ for (i=1;i<=n;i++)ans|=a[i]; return printf ( "%d" ,ans),0; } if (mx<=100000){ for (i=0;i<131072;i++)f[0][i]=-N; f[0][0]=0; for (i=o=1;i<=n;i++,o^=1){ for (j=0;j<131072;j++)f[o][j]=f[o^1][j]+1; for (j=0;j<131072;j++) if (f[o^1][j]>=0)f[o][j|a[i]]=max(f[o][j|a[i]],f[o^1][j]); } for (i=131071;~i;i--) if (f[o^1][i]>=m) break ; return printf ( "%d" ,i),0; } dfs(1,0,0); return printf ( "%d" ,ans),0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· 从 Windows Forms 到微服务的经验教训
2016-02-20 BZOJ3084 : [Algorithmic Engagements 2011]The Shortest Period