



from collections import defaultdict






class SCREAMING_SNAKE_CASE__     :




    '''simple docstring'''






    def __init__(       self,		lowerCamelCase__,		lowerCamelCase__		):
        A :       Optional[int]          =   total  # total no of tasks (N)

        # DP table will have a dimension of (2^M)*N
        # initially all values are set to -1
        A :       Any          =   [
            [-1 for i in range(total + 1		)] for j in range(2 ** len(lowerCamelCase__		)		)
        ]

        A :       Optional[Any]          =   defaultdict(lowerCamelCase__		)  # stores the list of persons for each task

        # final_mask is used to check if all persons are included by setting all bits
        # to 1
        A :       Union[str, Any]          =   (1 << len(lowerCamelCase__		)) - 1






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__,		lowerCamelCase__		):
        # if mask == self.finalmask all persons are distributed tasks, return 1
        if mask == self.final_mask:
            return 1

        # if not everyone gets the task and no more tasks are available, return 0
        if task_no > self.total_tasks:
            return 0

        # if case already considered
        if self.dp[mask][task_no] != -1:
            return self.dp[mask][task_no]

        # Number of ways when we don't this task in the arrangement
        A :       List[str]          =   self.count_ways_until(lowerCamelCase__,		task_no + 1		)

        # now assign the tasks one by one to all possible persons and recursively
        # assign for the remaining tasks.
        if task_no in self.task:
            for p in self.task[task_no]:
                # if p is already given a task
                if mask & (1 << p):
                    continue

                # assign this task to p and change the mask value. And recursively
                # assign tasks with the new mask value.
                total_ways_util += self.count_ways_until(mask | (1 << p),		task_no + 1		)

        # save the value.
        A :       str          =   total_ways_util

        return self.dp[mask][task_no]






    def 			_lowerCAmelCase					(       self,		lowerCamelCase__		):
        # Store the list of persons for each task
        for i in range(len(lowerCamelCase__		)		):
            for j in task_performed[i]:
                self.task[j].append(lowerCamelCase__		)

        # call the function to fill the DP table, final answer is stored in dp[0][1]
        return self.count_ways_until(0,		1		)


if __name__ == "__main__":
     SCREAMING_SNAKE_CASE_:Optional[int]             =						5  # total no of tasks (the value of N)

     # the list of tasks that can be done by M persons.
     SCREAMING_SNAKE_CASE_:List[str]             =						[[1, 3, 4], [1, 2, 5], [3, 4]]
     print(
         AssignmentUsingBitmask(task_performed, total_tasks).count_no_of_ways(
             task_performed
         )
     )









'''simple docstring'''

from collections.abc import Sequence





def lowerCamelCase						(     __lowerCamelCase :    Sequence[float]					,       __lowerCamelCase :    bool = False    )						->float:
    if not arr:
        return 0

    _SCREAMING_SNAKE_CASE									=			0 if allow_empty_subarrays else float("""-inf"""    )
    _SCREAMING_SNAKE_CASE									=			0.0
    for num in arr:
        _SCREAMING_SNAKE_CASE									=			max(0 if allow_empty_subarrays else num					,       curr_sum + num    )
        _SCREAMING_SNAKE_CASE									=			max(__lowerCamelCase					,       __lowerCamelCase    )

    return max_sum


if __name__ == "__main__":
      from doctest import testmod

      testmod()

      lowercase_					= [-2, 1, -3, 4, -1, 2, 1, -5, 4]
      print(f"""{max_subarray_sum(nums) = }""")



