@@ -100,3 +100,50 @@ const colorTheGrid = function(m, n) {
100
100
101
101
return dp ( 0 , 0 )
102
102
} ;
103
+
104
+ // another
105
+
106
+ /**
107
+ * @param {number } m
108
+ * @param {number } n
109
+ * @return {number }
110
+ */
111
+ const colorTheGrid = function ( m , n ) {
112
+ const mod = 1e9 + 7
113
+ const limit = 1 << ( 2 * m )
114
+ const memo = Array . from ( { length : n } , ( ) => Array ( limit ) )
115
+
116
+ return dp ( 0 , 0 )
117
+
118
+ function dp ( col , preColMask ) {
119
+ if ( col === n ) return 1
120
+ let res = 0
121
+
122
+ if ( memo [ col ] [ preColMask ] != null ) return memo [ col ] [ preColMask ]
123
+ const curColMasks = [ ]
124
+ dfs ( preColMask , 0 , 0 , curColMasks )
125
+ for ( const colMask of curColMasks ) {
126
+ res = ( res + dp ( col + 1 , colMask ) ) % mod
127
+ }
128
+ return memo [ col ] [ preColMask ] = res
129
+ }
130
+
131
+ function dfs ( preColMask , curColMask , row , res ) {
132
+ if ( row === m ) {
133
+ res . push ( curColMask )
134
+ return
135
+ }
136
+ for ( let i = 1 ; i <= 3 ; i ++ ) {
137
+ if ( getColor ( preColMask , row ) !== i && ( row === 0 || getColor ( curColMask , row - 1 ) !== i ) ) {
138
+ dfs ( preColMask , setColor ( curColMask , row , i ) , row + 1 , res )
139
+ }
140
+ }
141
+ }
142
+
143
+ function getColor ( mask , row ) {
144
+ return ( mask >> ( 2 * row ) ) & 3
145
+ }
146
+ function setColor ( mask , row , val ) {
147
+ return mask | ( val << ( 2 * row ) )
148
+ }
149
+ } ;
0 commit comments