题目描述:

给定一个长度为\(n\)的数列\(a\),求\(a\)的子序列\(b\)的最长长度,满足bi&bi-1!=0(\(2<=i<=len\))。

90分做法:

并没有部分分,但是我们可以很容易地想出\(O(n^2)\)算法:诸如最长上升子序列。

但是一定要注意位运算需要大力加括号,就算是与运算!!(因为这个WA了好几次hhh)

#include<cstdio>
#include<algorithm> using namespace std; int n,ans;
int a[100090],f[100090]; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
if((a[i]&a[j])!=0) f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}

AC做法:

其实我们并不需要枚举由谁转移过来。首先这是位运算,我们要有点经验,这个情况一定是按位枚举的,状态量不会很大(\(30\)左右?)我们从位的角度出发:

因为是要求与运算不为0,那么两个数的二进制表示一定存在一位使得两个数的这位都为1.

设\(f[i]\)为数列到目前为止最后一项第\(i\)位为1最长子序列长度,对于每一个新数,我们用它来找到一个它为结尾的最长长度,再用这个最长长度来更新其他答案。

#include<cstdio>
#include<algorithm> using namespace std; int n,ans;
int a[100090],f[100090]; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
int qwq=0;
for(int j=0;j<=30;j++)
if(a[i]&(1<<j)) qwq=max(qwq,f[j]+1);
for(int j=0;j<=30;j++)
if(a[i]&(1<<j)) f[j]=max(f[j],qwq);
}
for(int i=0;i<=30;i++)
ans=max(ans,f[i]);
printf("%d\n",ans);
return 0;
}

1.和位运算有关的dp从位的角度出发

2.位运算大力加括号。

bzoj4300 绝世好题 【dp】By cellur925的更多相关文章

  1. BZOJ4300:绝世好题(DP)

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

  2. bzoj4300绝世好题

    bzoj4300绝世好题 题意: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0.n≤100000,ai≤10^9. 题解: 用f[i]表示当前二进制i为1 ...

  3. bzoj 4300: 绝世好题 dp

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

  4. [bzoj4300]绝世好题_二进制拆分

    绝世好题 bzoj-4300 题目大意:题目链接. 注释:略. 想法: 二进制拆分然后用一个数组单独存一下当前答案即可. Code: #include <iostream> #includ ...

  5. bzoj千题计划190:bzoj4300: 绝世好题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> # ...

  6. 2018.09.27 bzoj4300: 绝世好题(二进制dp)

    传送门 简单dp. 根据题目的描述. 如果数列bn{b_n}bn​合法. 那么有:bi−1b_{i-1}bi−1​&bi!=0b_i!=0bi​!=0,因此我们用f[i]f[i]f[i]表示数 ...

  7. 【bzoj4300】绝世好题 dp

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

  8. bzoj4300: 绝世好题(DP)

    按位DP f[i]表示第i位为1的最长子序列 #include<iostream> #include<cstring> #include<cstdlib> #inc ...

  9. BZOJ4300 绝世好题 【dp】

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

随机推荐

  1. JDBC编程步奏、问题总结(一)

    jdbc编程步骤: 1. 加载数据库驱动 2. 创建并获取数据库链接 3. 创建jdbc statement对象 4. 设置sql语句 5. 设置sql语句中的参数(使用preparedStateme ...

  2. Composite Pattern

    1.将对象组合成树形结构以表示“部分--整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 2.Composite 模式结构图 3.实现 #ifndef _COMPONENT_H ...

  3. rtmp搭建直播系统

    开发环境 Ubuntu 14.04 server nginx-1.8.1 nginx-rtmp-module nginx的服务器的搭建 安装nginx的依赖库 sudo apt-get update ...

  4. [转]FPGA实践——基于ROM访问的直接波形合成

    本文原创,转载请注明出处:http://www.cnblogs.com/risten/p/4166169.html 1.系统原理 通过频率控制字选择相位步进,产生访问ROM的地址,进而控制DAC的输出 ...

  5. html5--3.5 input元素(4)

    html5--3.5 input元素(4) 学习要点 input元素及其属性 input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等 不仅可以布置在表单中,也可以在表单之外的元素使用 i ...

  6. hdu-4857 逃生(拓扑序)

    题目链接: 逃生 Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Proble ...

  7. Exception in thread “main” java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone.

    Exception in thread “main” java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecogn ...

  8. DataWindow.NET 控件 实现点击列头排序

    1.定义字段                         Boolean ib_SetSort = true;                string is_SortType = " ...

  9. SecureCRT rz上传文件失败

    SecureCRT 将 Windows 上的文件传至 Linux 端,小的文件没有问题能够正常上传,但是对于几百M的文件往往上传过程中失败. 解决办法:使用 rz -be,并且去掉对话框中" ...

  10. 你忘记的java运算符

    当整数被0除时会得到一个无穷大,或者nan, 所以会抛出数据溢出的异常.