博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 4300 绝世好题——DP
阅读量:7122 次
发布时间:2019-06-28

本文共 992 字,大约阅读时间需要 3 分钟。

题目:

考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ i ] != 0 的,也就是有至少1位公共的1;所以在30位上记录这一位是1的那些 a[ ] 中的 dp[ ] 最大值,就能转移了。

#include
#include
#include
#include
using namespace std;const int N=1e5,M=35;int n,a[N],bin[M],c[M],lm,ans;int rdn(){ int ret=0;bool fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){
if(ch=='-')fx=0;ch=getchar();} while(ch>='0'&&ch<='9') ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar(); return fx?ret:-ret;}int main(){ int tp=0; n=rdn();for(int i=1;i<=n;i++)a[i]=rdn(),tp=max(tp,a[i]); while(tp)lm++,tp>>=1; lm--; bin[0]=1;for(int i=1;i<=lm;i++)bin[i]=bin[i-1]<<1; for(int i=1;i<=n;i++) { int d=0; for(int j=0;j<=lm&&bin[j]<=a[i];j++) if(a[i]&bin[j])d=max(d,c[j]); d++; for(int j=0;j<=lm&&bin[j]<=a[i];j++) if(a[i]&bin[j])c[j]=max(c[j],d); } for(int j=0;j<=lm;j++)ans=max(ans,c[j]); printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/9887220.html

你可能感兴趣的文章
触发器创建删除等操作
查看>>
Java版 数字金额大写转换
查看>>
Linux性能及调优指南(翻译)
查看>>
C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集...
查看>>
VS调试异常代码 HRESULT:0x80070057 (E_INVALIDARG)解决方法
查看>>
ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
查看>>
PHP程序员学习路线
查看>>
伯乐在线-技术分享
查看>>
性能测 试理论篇
查看>>
IIS和tomcat共用80端口
查看>>
ES6的模块化
查看>>
Eclipse中.setting目录下文件介绍
查看>>
Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库
查看>>
php调试工具——XDebug使用
查看>>
阿里百川IMSDK--自定义群聊界面
查看>>
JavaScript:日期选择器组件的使用
查看>>
Configure swagger with spring boot
查看>>
nginx重定向规则入门
查看>>
初始化参数之memory_target
查看>>
趣题一则:寻找那扇门
查看>>