BZOJ4976:宝石镶嵌(DP&思维)
Description
Input
Output
Sample Input
32 16 8 7
Sample Output
思路:之前遇到一个类似的题,不过是XOR不是OR,此题由于是OR,当要留的数比较多的时候一定能取到最大值,即a1|a2|...|an。
否则,我们可以dp,用dp[i][j]表示删去i个能否OR得到j。不难得到下面代码,复杂度O(17*N*1<<17),T了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int dp[][maxn],a[maxn],ans,Mx;
int main()
{
int N,K; scanf("%d%d",&N,&K); K=N-K;
for(int i=;i<=N;i++){
scanf("%d",&a[i]);
Mx|=a[i];
}
if(K>=) printf("%d\n",Mx);
else {
dp[][]=;
for(int i=;i<=N;i++){
for(int k=;k<=K;k++)
for(int j=;j<=Mx;j++){
dp[k][j|a[i]]|=dp[k-][j];
}
}
for(int i=;i<=Mx;i++) if(dp[K][i]) ans=i;
printf("%d\n",ans);
}
return ;
}
换个DP,我们用dp[i][j]表示前面i个得到j最多删去多少个,最后dp[N][i]>=K的最大i即是答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn=<<;
int dp[][maxn],a[maxn],ans,Mx; //dp:最多可以删去
int main()
{
int N,K; scanf("%d%d",&N,&K);
for(int i=;i<=N;i++){
scanf("%d",&a[i]);
Mx|=a[i];
}
if(N-K>=) printf("%d\n",Mx);
else {
for(int i=;i<=N;i++) for(int j=;j<=Mx;j++) dp[i][j]=-;
dp[][]=;
for(int i=;i<=N;i++){
for(int j=;j<=Mx;j++){
dp[i][j]=max(dp[i][j],dp[i-][j]+);
dp[i][j|a[i]]=max(dp[i][j|a[i]],dp[i-][j]);
}
}
for(int i=Mx;i>=;i--) if(dp[N][i]>=K){
ans=i; break;
}
printf("%d\n",ans);
}
return ;
}
BZOJ4976:宝石镶嵌(DP&思维)的更多相关文章
- 【bzoj4976】宝石镶嵌(思维dp)
题目传送门:bzoj4976 不得不说这是道脑洞dp,思路真的清奇. 我们可以发现,虽然n很大,但是k只有100,这里面似乎隐藏了什么玄机. 我们可以发现,设总共有$ tot $个二进制位在这n个数中 ...
- 【BZOJ4976】宝石镶嵌 DP
[BZOJ4976]宝石镶嵌 Description 魔法师小Q拥有n个宝石,每个宝石的魔力依次为w_1,w_2,...,w_n.他想把这些宝石镶嵌到自己的法杖上,来提升法杖的威力.不幸的是,小Q的法 ...
- cf1153D 树形dp+思维
一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...
- E. The Contest ( 简单DP || 思维 + 贪心)
传送门 题意: 有 n 个数 (1 ~ n) 分给了三个人 a, b, c: 其中 a 有 k1 个, b 有 k2 个, c 有 k3 个. 现在问最少需要多少操作,使得 a 中所有数 是 1 ~ ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
- codeforces 1140D(区间dp/思维题)
D. Minimum Triangulation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- POJ 1390 Blocks(DP + 思维)题解
题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们 ...
- “玲珑杯”ACM比赛 Round #18---图论你先敲完模板(DP+思维)
题目链接 DESCRIPTION INPUT OUTPUT SAMPLE INPUT 2 3 2 3 5 7 3 10 3 5 7 SAMPLE OUTPUT 12 26 HINT 官方题解: 代码如 ...
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
随机推荐
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 A题 Weather Patterns
2017-09-25 15:49:45 writer:pprp 阅读理解,当时没有耐心去读,只要能读懂就大概可以做出来 题意如下: 有四种天气, State 1: snow State 2: rain ...
- 2017 ACM/ICPC Asia Regional Qingdao Online - 1008 Chinese Zodiac
2017-09-17 13:28:04 writer:pprp 签到题:1008 Chinese Zodiac #include <iostream> #include <strin ...
- linux环境变量 export命令详解
由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"引发的问题 1.${HOME}:首先, HOME 是个变量 ...
- 超详细!mac flutter 创建过程及遇到的问题
虽然网上有教程,但是过程中遇到些问题,这些问题教程里并没有,所以写这个文章记录一下. 1.打开终端 2.clone flutter 命令: git clone -b beta https://gith ...
- 【Linux】无法添加用户,报“useradd: cannot open /etc/passwd”问题解决过程记录
问题描述 今天在一个新的Linux环境添加用户的时候,发现不能添加,遇到了以下错误 useradd: cannot open /etc/passwd 解决方法 用lsattr命令查看/etc/pass ...
- [嵌入式培训 笔记]-----Vim编辑器使用简介
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 第一讲小结 1. 光标在屏幕文本中的移动既 ...
- 51nod-1574-排列转换
1574 排列转换 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 现在有两个长度为n的排列p和s.要求通过交换 ...
- Linux IPv6 地址配置
添加IPV6地址ip -6 addr add <ipv6address>/<prefixlength> dev <interface>ip -6 addr add ...
- Vue打包上线部署
一.路径问题 1.脚手架+webpack打包通过npm run build,但是后台tomcat部署上线的时候,会衍生出一些问题,比如,路径问题(因为在项目中,我们使用了绝对路径,这里必须要使用相对路 ...
- 通过一道面试题了解Condition线程通信
Condition Condition接口描述了可能会与锁有关联的条件变量.这些变量在用法与使用Object.wait访问的隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个Lock可能与多 ...