BZOJ4300 绝世好题 【dp】】的更多相关文章

Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. Output 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. Sample Input 3 1 2 3 Sample Output 2 HINT n<=100000,ai<=2*10^9 Solution $f[i]$表示二进制下看第$i…
bzoj4300绝世好题 题意: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0.n≤100000,ai≤10^9. 题解: 用f[i]表示当前二进制i为1的最长子序列长度.每次求所有((1<<i)&bi)==1的f[i]最大值max,将所有((1<<i)&bi)==1的f[i]变为max+1. 代码: #include <cstdio> #include <cstring> #include &l…
4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Under two situations the player could score one point. ⋅1. If you touc…
绝世好题 bzoj-4300 题目大意:题目链接. 注释:略. 想法: 二进制拆分然后用一个数组单独存一下当前答案即可. Code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 100010 using namespace std; int a[N],p[32],f[N],mx[32]; inline char nc() {st…
http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; void read(int &x) { x=; char c=getchar(); while(!isdigit(c)) c=getchar(); +c-';…
传送门 简单dp. 根据题目的描述. 如果数列bn{b_n}bn​合法. 那么有:bi−1b_{i-1}bi−1​&bi!=0b_i!=0bi​!=0,因此我们用f[i]f[i]f[i]表示数列b最后一位第i个二进制位为1的时候b数列的最长长度. 然后简单转移一下就行了. #include<bits/stdc++.h> #define N 100005 using namespace std; inline int read(){ int ans=0; char ch=getchar(…
题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. 输出 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. 样例输入 3 1 2 3 样例输出 2 题解 dp 设f[i]为选i时前i个元素的最多个数. 那么就有f[i]=max{f[j]}+1 (a[j]&a[i]!=0) 这样会TLE,于是想优化. 如果a&…
按位DP f[i]表示第i位为1的最长子序列 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; int n,x,ans,mx; ]; void read(int &k) { ;k=;char c=getchar(); ),c…
题目 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入格式 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. 输出格式 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. 输入样例 3 1 2 3 输出样例 2 提示 n<=100000,ai<=2*10^9 题解 按位dp f[i] = max{f[j] + 1} (存在A[i]二进制某位和A[j]同时为1) 这样做是…
题目描述: 给定一个长度为\(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,…