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< ...
随机推荐
- [PyTorch]PyTorch/python常用语法/常见坑点
目录 1. make_grid() 2. join与os.path.join() 3. 读文件写文件 4. json操作 5. tensorboard使用 6. python shutil.move ...
- windchill系统安装大概步骤
1.安装VMware Workstation虚拟机 2.win7的64位操作系统(为什么不用32位?因为32位的内存最大只能设置4G) 3.安装Oracle数据库(映射iso文件[上面栏的虚拟机-&g ...
- C++学习——C++复合类型
1.引用 引用是为某一个变量起了另一个名字,定义方式为type &rval = val; 引用类型必须与引用的变量类型完全一致,引用后,rval和val将会被视为一个变量,只不过有两种调用方式 ...
- MySQL安装的N种方式
一.二进制包安装 1.)下载:在官网的下载页面下的服务器操作系统选择 Linux- Generic : 进制分发版的格式是:mysql-<版本>-<OS>-tar.gz 2. ...
- key中断
1 中断,很短的时间过去,然后回来.2 信号,软中断,而中断属于硬中断.3 实时内核,和分时内核.4 同步,预先知道发生,异步,预先不知道要发生,中断属于异步.5 arm一次执行一个中断.6 irq中 ...
- PHP返回32位与16位的md5加密值
字符串“123456”,经过md5算法加密之后是 32位: e10adc3949ba59abbe56e057f20f883e16位: 49ba59abbe56e057 PHP自带的 md5() 函数, ...
- 大小堆C++实现
C++大小堆实现(仿函数) 具体代码如下 #pragma once #include<iostream> #include<vector> using namespace st ...
- vue 全选多选
html: //全选按钮 <li class="choice_fme"> <div @click="checkAll" v-bind:clas ...
- Prism 4 文档 ---第8章 导航
作为同用户具有丰富的交互的客户端应用程序,它的用户界面(UI)将会持续不断的更新来反映用户工作的当前的任务和数据.用户界面可以进行一段时间相当大的变化作为用户交互的应用程序中完成各种任务.通过 ...
- 远程调用与编译DS作业
1.编译服务器上的ds作业 dscc /d 服务器地址:端口 /u 用户名 /p 密码 工程名称 /J 作业名称 解释: 作业名称:直接写作业名称即可,不用.pjb 2.执行服务器上的ds作业 dsj ...