



"""simple docstring"""


import math
class 			_a :
			"""simple docstring"""



			def __init__(		self     :    Optional[Any]				,   __UpperCamelCase     :    List[str]=0   )->List[str]:  # a graph with Node 0,1,...,N-1
							_UpperCAmelCase					=    n
							_UpperCAmelCase					=    [
							    [math.inf for j in range(0				,   __UpperCamelCase   )] for i in range(0				,   __UpperCamelCase   )
							]  # adjacency matrix for weight
							_UpperCAmelCase					=    [
							    [math.inf for j in range(0				,   __UpperCamelCase   )] for i in range(0				,   __UpperCamelCase   )
							]  # dp[i][j] stores minimum distance from i to j



			def  lowercase__						(		self     :    Union[str, Any]				,   __UpperCamelCase     :    int				,   __UpperCamelCase     :    Union[str, Any]				,   __UpperCamelCase     :    List[str]   )->str:
							_UpperCAmelCase					=    w



			def  lowercase__						(		self     :    Optional[int]   )->List[Any]:
							for k in range(0				,   self.n   ):
											for i in range(0				,   self.n   ):
															for j in range(0				,   self.n   ):
																			_UpperCAmelCase					=    min(self.dp[i][j]				,   self.dp[i][k] + self.dp[k][j]   )



			def  lowercase__						(		self     :    Optional[Any]				,   __UpperCamelCase     :    str				,   __UpperCamelCase     :    Optional[int]   )->Dict:
							return self.dp[u][v]


if __name__ == "__main__":
					__A   :							List[str]										=   Graph(5)
					graph.add_edge(0, 2, 9)
					graph.add_edge(0, 4, 10)
					graph.add_edge(1, 3, 5)
					graph.add_edge(2, 3, 7)
					graph.add_edge(3, 0, 10)
					graph.add_edge(3, 1, 2)
					graph.add_edge(3, 2, 1)
					graph.add_edge(3, 4, 6)
					graph.add_edge(4, 1, 3)
					graph.add_edge(4, 2, 4)
					graph.add_edge(4, 3, 9)
					graph.floyd_warshall()
					graph.show_min(1, 4)
					graph.show_min(0, 3)








"""simple docstring"""


import functools







def  lowercase	(      _SCREAMING_SNAKE_CASE   :						list[int]					,     _SCREAMING_SNAKE_CASE   :						list[int]				):






				'''simple docstring'''



				if not isinstance(_SCREAMING_SNAKE_CASE					,     _SCREAMING_SNAKE_CASE				) or not all(isinstance(_SCREAMING_SNAKE_CASE					,     _SCREAMING_SNAKE_CASE				) for day in days				):
								raise ValueError('''The parameter days should be a list of integers'''				)

				if len(_SCREAMING_SNAKE_CASE				) != 3 or not all(isinstance(_SCREAMING_SNAKE_CASE					,     _SCREAMING_SNAKE_CASE				) for cost in costs				):
								raise ValueError('''The parameter costs should be a list of three integers'''				)

				if len(_SCREAMING_SNAKE_CASE				) == 0:
								return 0

				if min(_SCREAMING_SNAKE_CASE				) <= 0:
								raise ValueError('''All days elements should be greater than 0'''				)

				if max(_SCREAMING_SNAKE_CASE				) >= 366:
								raise ValueError('''All days elements should be less than 366'''				)

				_UpperCAmelCase					=    set(_SCREAMING_SNAKE_CASE				)

				@functools.cache
				def dynamic_programming(_SCREAMING_SNAKE_CASE   :						int				) -> int:
								if index > 365:
												return 0

								if index not in days_set:
												return dynamic_programming(index + 1				)

								return min(
								    costs[0] + dynamic_programming(index + 1				)					,     costs[1] + dynamic_programming(index + 7				)					,     costs[2] + dynamic_programming(index + 30				)					,     )

				return dynamic_programming(1				)


if __name__ == "__main__":
					import doctest

					doctest.testmod()



