【HDU】5208 Where is Bob 【DP】

传送门:【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 ) ;//ok
					else ans = t + dfs ( cur - 1 , 0 , 0 , 0 , 0 ) ;//ok
				} else {//c = 0 , d = 1
					if ( a == 0 ) ans = dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//ok
					else ans = dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//ok
				}
			} else {//a = 0 , b = 1
				if ( c == d ) {
					if ( c == 0 ) ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//ok
					else 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 ) ;//ok
					else ans = t + dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//ok
				} else {
					if ( d == 1 ) ans = dfs ( cur - 1 , 0 , 0 , 1 , 1 ) ;//ok
					else ans = dfs ( cur - 1 , 0 , 0 , 1 , 0 ) ;//ok
				}
			} else {//a = 0 , b = 1
				if ( d == 1 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 1 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 0 ) ) ;//ok
				else 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 ) ;//ok
					else ans = t + dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//ok
				} else {//a = 1
					if ( c == 0 ) ans = dfs ( cur - 1 , 0 , 0 , 1 , 1 ) ;//ok
					else ans = dfs ( cur - 1 , 0 , 0 , 0 , 1 ) ;//ok
				}
			} else {//a = 0 , b = 1
				if ( c == 0 ) ans = max ( dfs ( cur - 1 , 0 , 1 , 0 , 1 ) , dfs ( cur - 1 , 1 , 0 , 1 , 1 ) ) ;//ok
				else 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 ) ;//ok
			else 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 ) ;//ok
					else ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//ok
				} else {//c = 0
					if ( b == 1 ) ans = t + dfs ( cur - 1 , 1 , 0 , 0 , 0 ) ;//ok
					else 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 ) ) ;//ok
				else 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 ) ) ;//ok
				else 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 ) ) ;//ok
			else 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 ) ) ;//ok
			else 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 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值