Skip to content

Commit 52bb8ec

Browse files
committed
Runtime 1110 ms (Top 12.5%) | Memory 137.0 MB (Top 5.0%)
1 parent 64ab4a6 commit 52bb8ec

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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

Comments
 (0)