博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 981D Bookshelves(按位贪心+二维DP)
阅读量:4541 次
发布时间:2019-06-08

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

题目链接:

题目大意:

给你n本书以及每本书的价值,现在让你把n本书放到k个书架上(只有连续的几本书可以放到一个书架上),
每个书架的价值值是书架上每本书的价值和,总的价值每个书架权值按位与的结果,要求输出最大的总价值。
解题思路:
按位从高到低枚举,每次都判断一下是否符合条件(即判断ans|(1<<i)是否能够取到),如果符合则更新答案。
判断过程:
设dp[i][j]表示将1~i分为j段是否符合条件,
然后枚举区间,状态转移方程为dp[i][j]|=dp[i-1][k-1],( ((a[j]-a[i])&ans)==ans,0<=i<j<=n )
最后只要判断dp[n][k]是否为1即可。

 

代码:

1 #include
2 #define lc(a) (a<<1) 3 #define rc(a) (a<<1|1) 4 #define MID(a,b) ((a+b)>>1) 5 #define fin(name) freopen(name,"r",stdin) 6 #define fout(name) freopen(name,"w",stdout) 7 #define clr(arr,val) memset(arr,val,sizeof(arr)) 8 #define _for(i,start,end) for(int i=start;i<=end;i++) 9 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);10 using namespace std;11 typedef long long LL;12 const int N=1e2+5;13 const int INF=0x3f3f3f3f;14 const double eps=1e-10;15 16 int n,p;17 LL a[N],dp[N][N];//dp[i][j]表示1~i分j段是否符合条件 18 19 bool check(LL x){20 memset(dp,0,sizeof(dp));21 dp[0][0]=1;22 for(int k=1;k<=p;k++){23 for(int i=0;i
>n>>p;38 for(int i=1;i<=n;i++){39 cin>>a[i];40 a[i]+=a[i-1];41 }42 LL ans=0;43 for(int i=60;i>=0;i--){44 ans|=(1LL<

 

转载于:https://www.cnblogs.com/fu3638/p/9131470.html

你可能感兴趣的文章
面试准备——相关知识
查看>>
每日一字:悟
查看>>
CentOS7.6安装稳定版Nginx
查看>>
LeetCode 1002. Find Common Characters (查找常用字符)
查看>>
建立隐藏管理员用户
查看>>
android设置图文提醒功能
查看>>
ajax跨域提交
查看>>
完成登录与注册页面的前端
查看>>
Mac下source tree 下的安装
查看>>
Q学习原理及例子
查看>>
rpmbuild 源码打包clickhouse,附带打好的rpm包下载地址
查看>>
软件体系结构原理、方法与实践总结
查看>>
2017-2018-1 《程序设计与数据结构》第3周学习总结
查看>>
一些基础语法
查看>>
360多万条信息把一台服务器快拖卡了
查看>>
Git详解之六 Git工具
查看>>
等高布局display:table
查看>>
onunload与onbeforeunload事件解析 ...
查看>>
Openjudge-计算概论(A)-取石子游戏
查看>>
python-装饰器
查看>>