BZOJ-4976 (分类+dp)
2017-09-26 14:16
246 查看
题目
information4976: 宝石镶嵌
Time Limit: 2 Sec Memory Limit: 128 MB
Description
魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,…,w_n。他想把这些宝石镶嵌到自己的法杖上,来提升法杖的威力。不幸的是,小Q的法杖上宝石镶嵌栏太少了,他必须扔掉k个宝石才能将剩下的宝石镶嵌上去。法杖的威力等于镶嵌在上面的所有宝石的魔力按位做或(OR)运算的结果,请写一个程序帮助小Q做出最佳的选择,使得法杖的威力最大。
Input
第一行包含两个正整数n,k(2<=n<=100000,1<=k<=100,k
分析
题目就是给一堆数,去掉 k 个,使得剩下数或起来最大,求最大值。看到 k 很小,值域很小(7位),n 很大,可以这样考虑
要是 n>17+k ,那么取得到的值一定是全部的数或起来。
否则,弄个 n*
2^17的 dp 即可。
程序
//http://www.lydsy.com/JudgeOnline/problem.php?cid=1008&pid=5 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,k,s,a[100005],f[155][180005]; //空间卡的紧,因此 MLE 了两发…… int main(){ freopen("1.txt","r",stdin); scanf("%d%d",&n,&k); for (int i=1; i<=n; i++) scanf("%d",&a[i]),s|=a[i]; if (17+k<n){printf("%d",s); return 0;} memset(f,0x7f,sizeof(f)); f[0][0]=0; for (int i=0; i<n; i++) for (int j=0; j<(1<<17); j++) if (f[i][j]<0x7f){ f[i+1][j]=min(f[i][j],f[i+1][j]); f[i+1][j|a[i+1]]=min(f[i+1][j|a[i+1]],f[i][j]+1); } for (int i=(1<<17)-1; i>=0; i--) if (f [i]<=n-k){ printf("%d",i); return 0; } }
相关文章推荐
- 【BZOJ 1084】【SCOI 2005】最大子矩阵【DP & 分类讨论】
- [bzoj4976][dp]宝石镶嵌
- 【BZOJ4976】宝石镶嵌 DP
- [BZOJ1177]APIO2009 Oil|前缀和|DP|分类
- bzoj4976宝石镶嵌 DP
- 【BZOJ1649】[Usaco2006 Dec]Cow Roller Coaster【背包DP】
- BZOJ 1025: [SCOI2009]游戏 [置换群 DP]
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告
- BZOJ 1264: [AHOI2006]基因匹配Match 树状数组,DP
- bzoj 4501: 旅行 01分数规划+概率期望dp
- bzoj 1566 NOI 2009 管道取珠 DP 解题报告
- bzoj 1037(dp)
- BZOJ 2216: [Poi2011]Lightning Conductor 决策单调性DP
- 【斜率优化DP】BZOJ1597 [Usaco2008 Mar]土地购买
- 【BZOJ2660】[Beijing wc2012]最多的方案【找规律】【计数DP】【二进制】【Fibonacci】
- BZOJ 4742: [Usaco2016 Dec]Team Building ——DP
- BZOJ 1912 [Apio2010]patrol 巡逻 - 树形DP(树的直径)
- [BZOJ1072] [SCOI2007] 排列perm - dfs/dp
- BZOJ 1040 骑士 (并查集 树形dp)
- BZOJ 3039: 玉蟾宫【dp】