绝世好题(DP)
题目链接:绝世好题
暴力就不用说了,和lis神似,O(n2)妥妥的挂掉,但可以得大部分分(好像是90,80)...
考虑优化,来一发非正解的优化:
#include<bits/stdc++.h>
using namespace std;
const int N=101000;
int n,a[N],f[N],ans,tot;
priority_queue<pair<int,int> >q;
struct gg
{
int x,y;
}b[N];
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
inline int dfs(int x)
{
if(q.empty()) return 0;
int x1=q.top().first;
int x2=q.top().second;
if((x&x2)==0){b[++tot].x=x1;b[tot].y=x2;q.pop();return (dfs(x));}
else return x1;
}
int main()
{
// freopen("1.in","r",stdin);
n=read();
for(register int i=1;i<=n;++i) a[i]=read();
for(register int i=1;i<=n;++i)
{
tot=0;
f[i]=dfs(a[i])+1;q.push(make_pair(f[i],a[i]));
ans=max(ans,f[i]);
for(register int j=1;j<=tot;++j) q.push(make_pair(b[j].x,b[j].y));
}
printf("%d",ans);
return 0;
}
其实优化很显然,我们用大根堆维护一个最大的f[j](j<i)和他的权值,每次更新i时,从大跟堆中弹出来最大的,检验是否符合条件,不符合再弹,其实最坏的复杂度还是O(n2logn)但考虑到数据不会正好卡,且每次查询的第一个最大的,大概率会符合条件,所以...就过了;
这里要说的不是暴力有多优秀,而是我们在优化某些算法时,考虑多枚举了那些无用的元素,想办法将他剪掉就可以了,尽量让电脑做有用功...
之后考虑正解,是与二进制有关的,这也是我第一次有点认真的啃二进制的知识...
我们思考一个数i,它的前继j和他&不为0,也就是说,i和j在二进制位上,至少有一个位上两个都是1,那我们就可以将信息放在这一位上,因为我们可以查询i的每一位,为1,就可以将上一个距离他最近的那一位也为1的j转移过来.可以用f[i]表示在当前状态下,第i个数为1的数的最长序列长度.
考虑过转移,之后考虑怎么更新f数组。对于i我们在各个为1的位上去个max作为它的前继,那怎么将第i个数的长度最长为k记录下来呢?我们可以思考之后的数如果将i作为前继,那么必须和i有一个位上都为1,那这就好办了,我们在i为1的每一个位上都更新成刚才取得max,这样状态就记录下来...
#include<bits/stdc++.h>
using namespace std;
int n,f[35],s1,s,ans;
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
int main()
{
freopen("1.in","r",stdin);
n=read();
for(register int i=1;i<=n;++i)
{
int x=read();s1=x;s=0;
for(register int j=1;s1;++j)
{
if(s1&1) s=max(s,f[j]);
s1>>=1; //对所有为1的位取max作为前继
}
s1=x;
for(register int j=1;s1;++j)
{
if(s1&1) f[j]=s+1; //对所有为1的位更新成当前的最大值.
s1>>=1;
}
}
for(register int i=1;i<=32;++i) ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}
绝世好题(DP)的更多相关文章
- bzoj 4300: 绝世好题 dp
4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...
- 【bzoj4300】绝世好题 dp
题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入 输入文件共2行. 第一行包括一个整数n. 第二行包括n个 ...
- bzoj 4300 绝世好题——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ ...
- BZOJ4300:绝世好题(DP)
Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...
- 【洛谷】4310: 绝世好题【二进制DP】
P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入输出格式 输入格式: 输入文件共2行 ...
- BZOJ-4300 绝世好(蛋疼)题 DP(递推)
翻zky学长的blog时翻出来的..... 4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 736 Solved: 393 [Sub ...
- BZOJ 4300: 绝世好题 动态规划
4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...
- 【递推】BZOJ 4300:绝世好题
4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 564 Solved: 289[Submit][Status][Discuss] ...
- P4310 绝世好题
P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 说明 对于100%的数据,1<=n ...
随机推荐
- java版gRPC实战之七:基于eureka的注册发现
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ECDSA—模逆模块
在有限域Fp上的非零元素a的逆记为a-1mod p .即在有限域Fp上存在唯一的一个元素x,使得ax恒等于1(mod p),则元素x为a的逆a-1 .本次设计采用扩展的整数Euclidean算法来求逆 ...
- 使用 VSCode 给STM32配置一个串口 printf 工程
使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串 ...
- 限制只有VIP会员才能下载Ecshop文章页的附件
以官方2.7.2默认模板为基础来讲述一下"如何在文章详情页限制只有VIP会员才能下载相关附件"这里假设VIP会员的等级ID为2首先修改 article.php 文件打开 /arti ...
- Java基础系列(32)- 递归讲解
递归 A方法调用B方法,我们很容易理解 递归就是:A方法调用A方法!就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题 ...
- Java基础系列(13)- 包机制
包机制 为了更好的组织类,Java提供了包机制,用于区别类名的命名空间 包语句的语法格式为: package pkg1[. pkg2[. pkg3...]]; 一般利用公司域名倒置作为报名 为了能够使 ...
- 为Python安装Redis库
为Python安装Redis库,登陆https://github.com/andymccurdy/redis-py 后点击Download ZIP下载安装包. 解压并安装: git clone htt ...
- 定要过python二级 第10套
第一部分 第一题 1. int* 字符串 =几个东西 2. 此题的最开始的疑惑 (1)01 02 03 怎么产生 for 循环 (2)<<< 这个怎么产生 (3)<这个&l ...
- 几分钟就能学会的Python虚拟环境教程
什么是虚拟环境 我们在使用Python的时候,通常用pip来进行包管理.比如我们要安装一个叫requests的库,那么我们就会采用以下命令去安装: pip install requests 那你知道, ...
- The art of multipropcessor programming 读书笔记-硬件基础2
本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...