【HDU】5208 Where is Bob 【DP】
来源:互联网 发布:chromium浏览器 linux 编辑:程序博客网 时间:2024/05/16 16:11
传送门:【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 ;}
0 0
- 【HDU】5208 Where is Bob 【DP】
- hdu 5208 Where is Bob(数位dp)
- hdu 5208 Where is Bob
- hdu 5208 Where is Bob
- hdu 5208 Where is Bob (数位dp,k进制树合并)
- hdu5208 Where is Bob 数位dp
- HDU5208 Where is Bob(数位DP,dfs)
- HDU 2262 Where is the canteen 概率DP 高斯消元
- HDU 4478 Where is the King
- HDU 4478(Where is the King)
- [HDU] 3660 Alice and Bob's Trip -- 树形DP?
- hdu 4123 Bob’s Race 树形DP + 单调队列
- HDU 4123--Bob’s Race(树形dp)
- HDU 4123 Bob’s Race 树状DP+RMQ预处理
- hdu - 3660 - Alice and Bob's Trip(树形dp)
- 树形dp-hdu-3660-Alice and Bob's Trip
- hdu 4123 Bob’s Race(树形DP+单调队列)
- hdu 3660 Alice and Bob's Trip(树形DP)
- jquery validation plugin 使用
- ___attribute__ 用法
- 剑指Offer-->斐波那契数列(三种实现方法)
- 欢迎使用CSDN-markdown编辑器
- CSU 1561-(More) Multiplication
- 【HDU】5208 Where is Bob 【DP】
- C++ 继承
- Preliminary understanding of bagging and boosting
- 电力系统软件应用
- Web 开发中很实用的10个效果【附源码下载】
- 特殊sql语句
- Your ways (动态规划)ACM-ICPC Asia Phuket Regional Programing Contest 2009
- Leetcode: Permutations II
- 几种优秀的大数库总结