SRM 511 DIV1 500pt(DP)
2014-12-12 15:49
375 查看
题目简述
给定n个数,两个人轮流取数,和之前两个人的取的数或起来,谁不能取数或者谁取到的数和之前的数或值为511谁输,问谁能够赢?
题解
刚开始的想法是直接搜,不过需要记录取过的值的状态,2^50显然超时。。。对于当前或值cur,或上一个数num,只有两种情况,要么是 cur|num==cur,
对于这种数,只是把这个状态直接给下一个玩家,起到延缓一步的作用,他们的选取顺序对局面没有影响,可以先全部轮流取掉,如果这种数的个数大于当前已经取的数的数量,那么我们还可以选择这种数,如果选择这个数可以导致下一个局面必败,那么当前这个局面可以必赢。第二种情况就是cur|num!=cur,num肯定是没有取过的,如果存在一个数num导致下一个局面必败,那么当前这个局面也是必胜的。如果下一个局面必胜,那么当前局面就是必输的,我们可以用记忆化搜索实现上述过程~~~
代码:
给定n个数,两个人轮流取数,和之前两个人的取的数或起来,谁不能取数或者谁取到的数和之前的数或值为511谁输,问谁能够赢?
题解
刚开始的想法是直接搜,不过需要记录取过的值的状态,2^50显然超时。。。对于当前或值cur,或上一个数num,只有两种情况,要么是 cur|num==cur,
对于这种数,只是把这个状态直接给下一个玩家,起到延缓一步的作用,他们的选取顺序对局面没有影响,可以先全部轮流取掉,如果这种数的个数大于当前已经取的数的数量,那么我们还可以选择这种数,如果选择这个数可以导致下一个局面必败,那么当前这个局面可以必赢。第二种情况就是cur|num!=cur,num肯定是没有取过的,如果存在一个数num导致下一个局面必败,那么当前这个局面也是必胜的。如果下一个局面必胜,那么当前局面就是必输的,我们可以用记忆化搜索实现上述过程~~~
代码:
vector<int>card; int dp[55][555], n; int dfs(int th, int mask) { if (mask == 511) return 1; if (th == n) return 0; if (~dp[mask]) return dp [mask]; int cnt = 0; for (int i = 0; i < n; i++) if ((card[i] | mask ) == mask) cnt++; if (cnt > th && !dfs(th + 1, mask)) return dp [mask] = 1; for (int i = 0; i < n; i++) if ((card[i] | mask ) != mask) { if (!dfs(th + 1, mask | card[i])) return dp [mask] = 1; } return 0; } class FiveHundredEleven { public: string theWinner(vector <int> cards) { card = cards; n = card.size(); memset(dp, -1, sizeof(dp)); return dfs(0, 0) ? "Fox Ciel" : "Toastman"; } }; 相关文章推荐
- SRM 508 DIV1 500pt(DP)
- SRM 501 DIV1 500pt(DP)
- TC SRM 659 DIV1 500pt 插头DP
- SRM 509 DIV1 500pt(DP)
- SRM 502 DIV1 500pt(DP)
- SRM 514 DIV1 500pt(DP)
- srm 302 div2 1000(简单题,bfs,dp)
- 状态压缩DP SRM 667 Div1 250
- SRM 607 D1 L1:PalindromicSubstringsDiv1,DP
- SRM 613 div1 500pt
- topcoder SRM 666 DIV2 CollectingTokens 树形dp
- TopCoder SRM 649 Div2 Problem 500 - CartInSupermarketEasy (区间DP)
- Topcoder SRM 144 Div1 550(数学和dp问题求方案数,很有意思)
- srm 308 div2 1000(DP, 离散背包+连续背包)
- [树形DP 杂题] SRM 562 div1 InducedSubgraphs
- [补集转换 DP] Topcoder SRM 509 DIV1 Hard. NumberLabyrinthDiv1
- SRM 448 DIV 1 总结(dfs, dp)
- srm 306 div2 1000 (字符串dp,进阶)
- TopCoder SRM 666 Div2 Problem 999 - WalkOverATreeDiv2 (树形DP)
- Topcoder SRM 144 Div2 1100 (树形dp)