传送门:【HDU】5208 Where is Bob

题目分析:

设状态为dp[cur][l1][r1][l2][r2],cur表示当前二进制位的位置,l1表示第一个人的数的下界,r1表示第一个人的数的上界,l2表示第二个人的数的下界,r2表示第二个人的数的上界。l1,r1,l2,r2都是01变量,对于第一个数,如果数卡着下界不能变小时l1置为0,否则l1置为1表示可以变小。第一个数的r1,以及第二个数的l2,r2同理。

然后我们dp从数的高位开始,注意到某一位如果最后能变为1,则优先变为1,因为后面所有的1加起来都比这个1小。然后我们对所有情况判断=。=讨论自己应该怎么选,以及对面怎么针对,情况有分支的取个最大值。这样最后dp[最高位][0][0][0][0]就是答案。

PS:这篇博文就是为了吐嘈我为了AC这题而写的!足足写了我130多行的if、else=。=太笨了,只能所有情况一一讨论过去了。。

my code:

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <math.h>
#include <string>
#include <vector>
using namespace std;typedef long long LL ;#define rep( i , a , b ) for ( int i = ( a ) ; i <  ( b ) ; ++ i )
#define For( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define rev( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define clr( a , x ) memset ( a , x , sizeof a )
#define cpy( a , x ) memcpy ( a , x , sizeof a )const int MAXN = 31 ;int dp[MAXN][2][2][2][2] ;
int vis[MAXN][2][2][2][2] ;
int L1 , R1 , L2 , R2 ;int dfs ( int cur , int l1 , int r1 , int l2 , int r2 ) {if ( cur == -1 ) return 0 ;if ( vis[cur][l1][r1][l2][r2] ) return dp[cur][l1][r1][l2][r2] ;vis[cur][l1][r1][l2][r2] = 1 ;int ans = 0 , t = 1 << cur ;int a = L1 >> cur & 1 ;int b = R1 >> cur & 1 ;int c = L2 >> cur & 1 ;int d = R2 >> cur & 1 ;if ( !l1 && !r1 ) {if ( !l2 && !r2 ) {if ( a == b ) {if ( c == d ) {if ( a == c ) ans = dfs ( cur - 1 , 0 , 0 , 0 , 0 ) ;//okelse ans = t + dfs ( cur - 1 , 0 , 0 , 0 , 0 ) ;//ok} else {//c = 0 , d = 1if ( a == 0 ) ans = dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//okelse ans = dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//ok}} else {//a = 0 , b = 1if ( c == d ) {if ( c == 0 ) ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//okelse ans = t + dfs ( cur - 1 , 0 , 1 , 0 , 0 ) ;//ok} else {ans = max ( dfs ( cur - 1 , 0 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ) ;//ok}}} else if ( l2 && !r2 ) {if ( a == b ) {if ( a == 1 ) {if ( d == 1 ) ans = dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//okelse ans = t + dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//ok} else {if ( d == 1 ) ans = dfs ( cur - 1 , 0 , 0 , 1 , 1 ) ;//okelse ans = dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//ok}} else {//a = 0 , b = 1if ( d == 1 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 1 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ) ;//okelse ans = t + dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ;//ok}} else if ( !l2 && r2 ) {if ( a == b ) {if ( a == 0 ) {if ( c == 0 ) ans = dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//okelse ans = t + dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//ok} else {//a = 1if ( c == 0 ) ans = dfs ( cur - 1 , 0 , 0 , 1 , 1 ) ;//okelse ans = dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//ok}} else {//a = 0 , b = 1if ( c == 0 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 1 ) ) ;//okelse ans = t + dfs ( cur - 1 , 0 , 1 , 0 , 1 ) ;//ok}} else if ( l2 && r2 ) {if ( a == b ) ans = dfs ( cur - 1 , 0 , 0 , 1 , 1 ) ;//okelse ans = max ( dfs ( cur - 1 , 1 , 0 , 1 , 1 ) , dfs ( cur - 1 , 0 , 1 , 1 , 1 ) ) ;//ok}} else if ( l1 && !r1 ) {if ( !l2 && !r2 ) {if ( c == d ) {if ( c == 1 ) {if ( b == 1 ) ans = t + dfs ( cur - 1 , 1 , 1 , 0 , 0 ) ;//okelse ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//ok} else {//c = 0if ( b == 1 ) ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//okelse ans = dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//ok}} else {if ( b == 1 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ) ;//okelse ans = dfs ( cur - 1 , 1 , 0 , 0 , 1 ) ;//ok}} else if ( l2 && !r2 ) {if ( d == 1 ) {if ( b == 1 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 1 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ) ;//okelse ans = dfs ( cur - 1 , 1 , 0 , 1 , 1 ) ;//here!!!!!!!!!!!!!!!!!! before ac , final one is zero} else {if ( b == 1 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 1 , 0 ) , t + dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ) ;else ans = dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ;}} else if ( !l2 && r2 ) {if ( c == 0 ) {if ( b == 1 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 1 ) ) ;else ans = dfs ( cur - 1 , 1 , 0 , 0 , 1 ) ;} else {if ( b == 1 ) ans = max ( t + dfs ( cur - 1 , 1 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 0 , 0 , 1 ) ) ;else ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 1 ) ;}} else if ( l2 && r2 ) {if ( b == 1 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 1 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 1 ) ) ;//okelse ans = dfs ( cur - 1 , 1 , 0 , 1 , 1 ) ;//ok}} else if ( !l1 && r1 ) {if ( !l2 && !r2 ) {if ( c == d ) {if ( c == 1 ) {if ( a == 0 ) ans = t + dfs ( cur - 1 , 0 , 1 , 0 , 0 ) ;else ans = dfs ( cur - 1 , 0 , 1 , 0 , 0 ) ;} else {if ( a == 0 ) ans = t + dfs ( cur - 1 , 1 , 1 , 0 , 0 ) ;else ans = t + dfs ( cur - 1 , 0 , 1 , 0 , 0 ) ;}} else {if ( a == 0 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 1 , 1 , 0 ) ) ;else ans = dfs ( cur - 1 , 0 , 1 , 1 , 0 ) ;}} else if ( l2 && !r2 ) {if ( d == 1 ) {if ( a == 0 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 1 , 1 ) , dfs ( cur - 1 , 1 , 1 , 1 , 0 ) ) ;else ans = dfs ( cur - 1 , 0 , 1 , 1 , 0 ) ;} else {if ( a == 0 ) ans = t + dfs ( cur - 1 , 0 , 1 , 1 , 0 ) ;else ans = t + dfs ( cur - 1 , 0 , 1 , 1 , 0 ) ;}} else if ( !l2 && r2 ) {if ( c == 0 ) {if ( a == 0 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 1 , 1 ) , dfs ( cur - 1 , 0 , 1 , 0 , 1 ) ) ;else ans = dfs ( cur - 1 , 0 , 1 , 1 , 1 ) ;} else {if ( a == 0 ) ans = t + dfs ( cur - 1 , 0 , 1 , 0 , 1 ) ;else ans = dfs ( cur - 1 , 0 , 1 , 0 , 1 ) ;}} else if ( l2 && r2 ) {if ( a == 0 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 1 , 1 ) , dfs ( cur - 1 , 1 , 1 , 1 , 1 ) ) ;//okelse ans = dfs ( cur - 1 , 0 , 1 , 1 , 1 ) ;//ok}} else if ( l1 && r1 ) {if ( !l2 && !r2 ) {if ( c == d ) ans = t + dfs ( cur - 1 , 1 , 1 , 0 , 0 ) ;else ans = max ( dfs ( cur - 1 , 1 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 1 , 1 , 0 ) ) ;} else if ( l2 && !r2 ) {if ( d == 1 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 1 , 0 ) , dfs ( cur - 1 , 1 , 1 , 1 , 1 ) ) ;else ans = t + dfs ( cur - 1 , 1 , 1 , 1 , 0 ) ;} else if ( !l2 && r2 ) {if ( c == 0 ) ans = max ( dfs ( cur - 1 , 1 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 1 , 1 , 1 ) ) ;else ans = t + dfs ( cur - 1 , 1 , 1 , 0 , 1 ) ;} else if ( l2 && r2 ) {ans = dfs ( cur - 1 , 1 , 1 , 1 , 1 ) ;//ok , ans = 0}}//printf ( "dp[%d][%d][%d][%d][%d] = %d\n" , cur , l1 , r1 , l2 , r2 , ans ) ;return dp[cur][l1][r1][l2][r2] = ans ;
}void solve ( int T ) {scanf ( "%d%d%d%d" , &L1 , &R1 , &L2 , &R2 ) ;clr ( vis , 0 ) ;int ans = dfs ( 30 , 0 , 0 , 0 , 0 ) ;printf ( "Case #%d: %d\n" , T , ans ) ;
}int main () {int T ;scanf ( "%d" , &T ) ;For ( i , 1 , T ) solve ( i ) ;return 0 ;
}

【HDU】5208 Where is Bob 【DP】相关推荐

  1. 【HDU 2612 Find a Way(BFS)】(兼BFS入门笔记)

    [HDU 2612 Find a Way(BFS)](兼BFS入门笔记) 原题入口: http://acm.hdu.edu.cn/showproblem.php?pid=2612 第一篇在CSDN的博 ...

  2. CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】

    正题 题面链接:https://www.luogu.com.cn/problem/CF932F 题目大意 nnn个点的一棵树,从xxx跳到yyy(要求yyy在xxx的子树中)会产生Ax∗ByA_x*B ...

  3. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

  4. 【HDU】3441 Rotation

    题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围.用C ...

  5. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

  6. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】最小费用最大流

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]带权二分图匹配 KM算法 In the kingdom of Henryy, there are N (2 <= N & ...

  7. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

    题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...

  8. 【HDU - 1455】Sticks (dfs + 剪枝)

    题干: George took sticks of the same length and cut them randomly until all parts became at most 50 un ...

  9. 【HDU - 4006】The kth great number (优先队列,求第k大的数)

    题干: Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to wri ...

  10. 【HDU - 4217 】Data Structure? (线段树求第k小数)

    题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...

最新文章

  1. Day11多态部分-4
  2. Caffe2:段错误(核心 已转储)
  3. sqlserver查看用户名密码_php 连接sql server数据库
  4. Codeforces Round #609 (Div. 2) D. Domino for Young 黑白染色
  5. add()方法和Put()方法的差别
  6. MyBatis四大核心概念
  7. 邮件实用技巧九:如何快速查看历史邮件
  8. mysql public权限_MySQL · 引擎特性 · Binlog encryption 浅析
  9. c++中的243、251、250错误原因
  10. pg8168改mac命令_使用PG8168修改8111b网卡MAC地址
  11. 2分钟入侵网站全程实录
  12. 测试用例(微信发朋友圈/评论/点赞/搜索/购物车)
  13. 马云退隐前,在年会上说了最重要的三件事
  14. effective c++ 学习笔记之 Shifting from c to c++
  15. 让资源管理器变得像Chrome一样标签化
  16. 微信识别图片文字直接导出Word方法
  17. Python入门之类的继承
  18. Hermitian matrix专题一
  19. Solve equation
  20. OpenCV实践:低对比度图像检测圆形轮廓

热门文章

  1. 实现开启和关闭android移动网络
  2. 2020上半年十大典型勒索软件大盘点
  3. JavaScript实现开关灯效果
  4. android 多张图片渐变切换控件
  5. JS封装小写字母转大写
  6. 【IoT】5.Business Strategy 商业战略
  7. c语言贪吃蛇游戏问题描述,贪吃蛇小游戏的几个问题
  8. Unity笔记之UGUI Text首行缩进、改变文本颜色、文本间距调节
  9. 解决:java.lang.UnsupportedClassVersionError
  10. TensorFlow Serving Architecture