1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| ''' Author: NEFU AB-IN Date: 2024-09-01 10:10:28 FilePath: \LeetCode\CP413\c\c.py LastEditTime: 2024-09-02 11:46:36 ''' import random from collections import Counter, defaultdict, deque
from curses.ascii import SO from datetime import datetime, timedelta from functools import lru_cache, reduce from heapq import heapify, heappop, heappush, nlargest, nsmallest from itertools import combinations, compress, permutations, starmap, tee from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt from string import ascii_lowercase, ascii_uppercase from sys import exit, setrecursionlimit, stdin from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar
TYPE = TypeVar('TYPE') N = int(2e5 + 10) M = int(20) INF = int(1e12) OFFSET = int(100) MOD = int(1e9 + 7)
setrecursionlimit(int(2e9))
class Arr: array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)]) array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)]) graph = staticmethod(lambda size=N: [[] for _ in range(size)])
class Math: max = staticmethod(lambda a, b: a if a > b else b) min = staticmethod(lambda a, b: a if a < b else b)
class Std: pass
class Solution: def maxScore(self, grid: List[List[int]]) -> int: n, m = len(grid), len(grid[0])
mx = 0 cnt_ = defaultdict(set) for i, row in enumerate(grid): for j, num in enumerate(row): cnt_[num].add(i) mx = Math.max(mx, num)
@lru_cache(None) def dfs(i: int, j: int): if i == 0: return 0 ans = dfs(i - 1, j)
for num in cnt_.keys(): if num > i: continue for row in cnt_[num]: if not (j >> row & 1): ans = Math.max(ans, dfs(num - 1, j | (1 << row)) + num) return ans
return dfs(mx, 0)
|