@@ -55,13 +55,115 @@ Same with other integers chosen by the first player, the second player will alwa
55
55
### ** Python3**
56
56
57
57
``` python
58
-
58
+ class Solution :
59
+ def canIWin (self , maxChoosableInteger : int , desiredTotal : int ) -> bool :
60
+ @lru_cache (None )
61
+ def dfs (state , t ):
62
+ for i in range (1 , maxChoosableInteger + 1 ):
63
+ if (state >> i) & 1 :
64
+ continue
65
+ if t + i >= desiredTotal or not dfs(state | 1 << i, t + i):
66
+ return True
67
+ return False
68
+
69
+ s = (1 + maxChoosableInteger) * maxChoosableInteger // 2
70
+ if s < desiredTotal:
71
+ return False
72
+ return dfs(0 , 0 )
59
73
```
60
74
61
75
### ** Java**
62
76
63
77
``` java
78
+ class Solution {
79
+ private Map<Integer , Boolean > memo = new HashMap<> ();
80
+
81
+ public boolean canIWin (int maxChoosableInteger , int desiredTotal ) {
82
+ int s = (1 + maxChoosableInteger) * maxChoosableInteger / 2 ;
83
+ if (s < desiredTotal) {
84
+ return false ;
85
+ }
86
+ return dfs(0 , 0 , maxChoosableInteger, desiredTotal);
87
+ }
88
+
89
+ private boolean dfs (int state , int t , int maxChoosableInteger , int desiredTotal ) {
90
+ if (memo. containsKey(state)) {
91
+ return memo. get(state);
92
+ }
93
+ boolean res = false ;
94
+ for (int i = 1 ; i <= maxChoosableInteger; ++ i) {
95
+ if (((state >> i) & 1 ) == 0 ) {
96
+ if (t + i >= desiredTotal || ! dfs(state | 1 << i, t + i, maxChoosableInteger, desiredTotal)) {
97
+ res = true ;
98
+ break ;
99
+ }
100
+ }
101
+ }
102
+ memo. put(state, res);
103
+ return res;
104
+ }
105
+ }
106
+ ```
107
+
108
+ ### ** C++**
109
+
110
+ ``` cpp
111
+ class Solution {
112
+ public:
113
+ bool canIWin(int maxChoosableInteger, int desiredTotal) {
114
+ int s = (1 + maxChoosableInteger) * maxChoosableInteger / 2;
115
+ if (s < desiredTotal) return false;
116
+ unordered_map<int, bool> memo;
117
+ return dfs(0, 0, maxChoosableInteger, desiredTotal, memo);
118
+ }
119
+
120
+ bool dfs(int state, int t, int maxChoosableInteger, int desiredTotal, unordered_map<int, bool>& memo) {
121
+ if (memo.count(state)) return memo[state];
122
+ bool res = false;
123
+ for (int i = 1; i <= maxChoosableInteger; ++i)
124
+ {
125
+ if ((state >> i) & 1) continue;
126
+ if (t + i >= desiredTotal || !dfs(state | 1 << i, t + i, maxChoosableInteger, desiredTotal, memo))
127
+ {
128
+ res = true;
129
+ break;
130
+ }
131
+ }
132
+ memo[state] = res;
133
+ return res;
134
+ }
135
+ };
136
+ ```
64
137
138
+ ### ** Go**
139
+
140
+ ``` go
141
+ func canIWin (maxChoosableInteger int , desiredTotal int ) bool {
142
+ s := (1 + maxChoosableInteger) * maxChoosableInteger / 2
143
+ if s < desiredTotal {
144
+ return false
145
+ }
146
+ memo := map [int ]bool {}
147
+ var dfs func (int , int ) bool
148
+ dfs = func (state, t int ) bool {
149
+ if v , ok := memo[state]; ok {
150
+ return v
151
+ }
152
+ res := false
153
+ for i := 1 ; i <= maxChoosableInteger; i++ {
154
+ if (state>>i)&1 == 1 {
155
+ continue
156
+ }
157
+ if t+i >= desiredTotal || !dfs (state|1 <<i, t+i) {
158
+ res = true
159
+ break
160
+ }
161
+ }
162
+ memo[state] = res
163
+ return res
164
+ }
165
+ return dfs (0 , 0 )
166
+ }
65
167
```
66
168
67
169
### ** ...**
0 commit comments