1
+ class Solution {
2
+ public:
3
+ int get_ternary_mask_bit (int mask,int i){
4
+ mask/=(int )pow (3 ,i);
5
+ return mask%3 ;
6
+ }
7
+ int get_next_mask (int mask,int val,int n){
8
+ return (mask*3 +val)%(243 );
9
+ }
10
+ int getMaxGridHappiness (int m, int n, int introvertsCount, int extrovertsCount) {
11
+ // --> index introvert_left extrovert_left introvert_mask extrovert_mask
12
+ // 0 -> empty
13
+ // 1 -> introvert
14
+ // 2 -> extrovert
15
+ vector<vector<vector<vector<int >>>> dp (26 ,vector<vector<vector<int >>>(7 ,vector<vector<int >>(7 ,vector<int >(244 ,INT_MIN))));
16
+ if (m>n)swap (m,n);
17
+ if (m==1 &&n==1 ){
18
+ if (introvertsCount)return 120 ;
19
+ else if (extrovertsCount)return 40 ;
20
+ else return 0 ;
21
+ }
22
+ map<pair<int ,int >,int > score_map_intro = {{{0 ,0 },120 },{{0 ,1 },120 -30 -30 },{{0 ,2 },120 +20 -30 },{{1 ,1 },120 -30 -30 -30 -30 },{{1 ,2 },120 -30 -30 -30 +20 },{{2 ,2 },120 -30 -30 +20 +20 }};
23
+ map<pair<int ,int >,int > score_map_extro = {{{0 ,0 },40 },{{0 ,1 },40 -30 +20 },{{0 ,2 },40 +20 +20 },{{1 ,1 },40 +20 +20 -30 -30 },{{1 ,2 },40 +20 +20 +20 -30 },{{2 ,2 },40 +20 +20 +20 +20 }};
24
+ int ans = 0 ;
25
+ for (int a=0 ;a<m*n;a++){
26
+ for (int b=introvertsCount;b>=0 ;b--){
27
+ for (int c=extrovertsCount;c>=0 ;c--){
28
+ for (int mask=0 ;mask<pow (3 ,5 );mask++){
29
+ int i = a/n;
30
+ int j = a%n;
31
+ int up_bit = i>0 ?(get_ternary_mask_bit (mask,n-1 )):(0 );
32
+ int left_bit = j>0 ?(get_ternary_mask_bit (mask,0 )):(0 );
33
+ if (a==0 )dp[a][b][c][mask]=0 ;
34
+ if (left_bit>up_bit)swap (left_bit,up_bit);
35
+ // case 1 making this cell empty
36
+ dp[a+1 ][b][c][get_next_mask (mask,0 ,n)]=max (dp[a+1 ][b][c][get_next_mask (mask,0 ,n)],dp[a][b][c][mask]);
37
+ // case 2 making this cell introvert
38
+ if (b>0 )
39
+ dp[a+1 ][b-1 ][c][get_next_mask (mask,1 ,n)]=max (dp[a+1 ][b-1 ][c][get_next_mask (mask,1 ,n)],dp[a][b][c][mask]+score_map_intro[{left_bit,up_bit}]);
40
+ // case 3 making this cell extrovert
41
+ if (c>0 )
42
+ dp[a+1 ][b][c-1 ][get_next_mask (mask,2 ,n)]=max ( dp[a+1 ][b][c-1 ][get_next_mask (mask,2 ,n)],dp[a][b][c][mask]+score_map_extro[{left_bit,up_bit}]);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ for (int b=introvertsCount;b>=0 ;b--)for (int c=extrovertsCount;c>=0 ;c--)for (int mask=0 ;mask<pow (3 ,5 );mask++)ans=max (ans,dp[n*m][b][c][mask]);
48
+
49
+ return ans;
50
+ }
51
+ };
0 commit comments