• can-i-win(好)


    https://leetcode.com/problems/can-i-win/

    package com.company;
    
    
    import java.util.*;
    
    class Solution {
    
        // 参考了下面的解法:
        // https://discuss.leetcode.com/topic/68773/java-solution
        // 开始没有用dp,超时了
        // discuss里面解法太牛逼了,用位图来作为key记录
        // 用Boolean而不是boolean来做数组,可以充分利用null的初始值
        // 其中 ^= 异或也用的非常好,非常到位,返回的时候也很好
    
        Boolean[] gotList;
        int m;
        int key;
    
        public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
            if ((1+maxChoosableInteger)*maxChoosableInteger < desiredTotal) {
                return false;
            }
    
            m = maxChoosableInteger;
            key = 0;
            gotList = new Boolean[1 << m];
            return win(desiredTotal);
    
        }
    
        private boolean win(int d) {
            if (gotList[key] != null) {
                return gotList[key];
            }
            for (int i=0; i<m; i++) {
                int bit = 1 << i;
                if ((key & bit) == 0) {
                    if (i+1 >= d) {
                        gotList[key] = true;
                        return true;
                    }
    
                    key ^= bit;
                    boolean tmp = false;
                    if (!win(d-i-1)) {
                        tmp = true;
                    }
                    key ^= bit;
                    if (tmp) {
                        gotList[key] = true;
                        return true;
                    }
                }
            }
            gotList[key] = false;
            return false;
        }
    
    }
    
    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
    
            System.out.println("Hello!");
            Solution solution = new Solution();
    
            // Your Codec object will be instantiated and called as such:
            int maxChoosableInteger = 18;
            int desiredTotal = 79;
            boolean ret = solution.canIWin(maxChoosableInteger, desiredTotal);
            System.out.printf("ret:%b
    ", ret);
    
            System.out.println();
    
        }
    
    }
  • 相关阅读:
    如何实现数据库实体生成工具
    linux samba 与 Windows 共享文件
    CUnit 的使用
    Xml Document与 xml反序列化
    c语言多文件链接
    c 递归获取文件与目录
    gdb输入输出重定向
    C 链表实现
    Log4net多程序集使用独立的配置文件
    Sqlite 学习 编译sqlite静态库,供其他项目调用
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6087555.html
Copyright © 2020-2023  润新知