1- # 풀이 실패
21class Solution :
3- def findPaths (self , m : int , n : int , maxMove : int , startRow : int , startColumn : int ) -> int :
4- memo = {}
5- MOD = 10 ** 9 + 7
62
7- def dp (r , c , moves ):
8- # 밖으로 탈출한 경우
9- if r < 0 or r >= m or c < 0 or c >= n :
10- return 1
3+ # 풍선 k가 가장 마지막으로 터진다면 양 옆의 풍선은 무조건 l, r임
4+ # 그러므로 k 기준으로 좌측(left, k), 우측(k, right)로 나눠서 배열 작성함
115
12- # 이동 횟수 전부 사용한 경우
13- if moves == 0 :
14- return 0
6+ def maxCoins (self , nums : List [int ]) -> int :
7+ # 양 끝 경계에 1을 추가한다
8+ A = [1 ] + nums + [1 ]
9+ n = len (A )
10+ dp = [[0 ] * n for _ in range (n )]
1511
16- # 이미 계산된 위치거나 남은 이동 횟수라면 저장된 값으로 사용
17- if (r , c , moves ) in memo :
18- return memo [(r , c , moves )]
12+ # l과 r 사이의 거리 구하기 (2부터 n-1까지)
13+ for length in range (2 , n ):
14+ for l in range (n - length ):
15+ r = l + length
1916
20- # 상, 하, 좌, 우 이동 경로 합산
21- res = (
22- dp (r + 1 , c , moves - 1 )
23- + dp (r - 1 , c , moves - 1 )
24- + dp (r , c + 1 , moves - 1 )
25- + dp (r , c - 1 , moves - 1 )
26- ) % MOD
17+ # l과 r 사이의 k 중 최댓값 찾아서 갱신함
18+ # k 마지막에 터뜨릴 때 얻는 코인 + 좌측 코인 + 우측 코인
19+ dp [l ][r ] = max (
20+ A [l ] * A [k ] * A [r ] + dp [l ][k ] + dp [k ][r ]
21+ for k in range (l + 1 , r )
22+ )
2723
28- # 결과 기록 후 반환
29- memo [(r , c , moves )] = res
30- return res
31-
32- return dp (startRow , startColumn , maxMove )
24+ return dp [0 ][n - 1 ]
0 commit comments