题目链接:绝世好题

暴力就不用说了,和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)的更多相关文章

  1. bzoj 4300: 绝世好题 dp

    4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  2. 【bzoj4300】绝世好题 dp

    题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入 输入文件共2行. 第一行包括一个整数n. 第二行包括n个 ...

  3. bzoj 4300 绝世好题——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ ...

  4. BZOJ4300:绝世好题(DP)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  5. 【洛谷】4310: 绝世好题【二进制DP】

    P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入输出格式 输入格式: 输入文件共2行 ...

  6. BZOJ-4300 绝世好(蛋疼)题 DP(递推)

    翻zky学长的blog时翻出来的..... 4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 736 Solved: 393 [Sub ...

  7. BZOJ 4300: 绝世好题 动态规划

    4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...

  8. 【递推】BZOJ 4300:绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 564  Solved: 289[Submit][Status][Discuss] ...

  9. P4310 绝世好题

    P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 说明 对于100%的数据,1<=n ...

随机推荐

  1. ARP-NAT(MAC Address Translation)的原理

    本文部分图片来自: http://wiki.deliberant.com/faq/wireless-bridge-routing-arpnat/ https://wiki.openwrt.org/do ...

  2. IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用,无需三方依赖,开源微服务全栈项目有来商城云环境的部署方式

    一. 前言 最近有些童鞋对开源微服务商城项目 youlai-mall 如何部署到线上环境以及项目中 的Dockerfile 文件有疑问,所以写了这篇文章做个答疑以及演示完整的微服务项目发布到线上的流程 ...

  3. 启动Jenkins后无法访问,如何排错

    做IT工作,使用各种工具的时候,遇到错误都是一堆英文,对于英语不好的人,看到报错可能就会心烦,我刚开始就是这种状态.后来,遇到问题,首先复制报错信息到百度上搜索,没有人请教的时候,你不能坐等问题自己解 ...

  4. Centos7安装配置Gitlab-CE

    GitLab介绍 GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业.学校等内部网络搭建git私服. 功能:Gitl ...

  5. virtualbox linux客户机中安装增强功能包缺少kernel头文件问题解决

    linux客户机中安装增强功能包总会提示缺少kernel头文件 根据发行版的不同,用命令行软件包管理命令安装dkms build-essential linux-headers-$(uname -r) ...

  6. 低差异序列 (low-discrepancy sequences)之Hammerysley在半球中采样点方法的介绍

    半球上的Hammersley 源作者:Holger Dammertz 一组关于如何在2D中使用Hammersley点集以在着色器程序中快速实用地生成半球方向的笔记.如果你发现任何错误或有意见,不要犹豫 ...

  7. Linux环境yum,安装MySQL

    Linux 使用yum命令安装mysql [安装步骤] 1.先检查系统是否安装有mysql [root@localhost ~]#yum list installed mysql* [root@loc ...

  8. 基于Hexo+Github Pages搭建的博客

    概念 Github Pages可以被认为是用户编写的.托管在github上的静态网页.使用Github Pages可以为你提供一个免费的服务器,免去了自己搭建服务器和写数据库的麻烦.此外还可以绑定自己 ...

  9. C#开发BIMFACE系列42 服务端API之图纸对比

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在我的前一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>中详细介绍了BIMFACE服务端接口 ...

  10. SpringBoot整合JDBC-调用数据库

    SpringData 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理. Sprin ...