프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

문제

algospot.com/judge/problem/read/TRIPATHCNT

 

algospot.com :: TRIPATHCNT

삼각형 위의 최대 경로 수 세기 문제 정보 문제 9 5 7 1 3 2 3 5 5 6 위 형태와 같이 삼각형 모양으로 배치된 자연수들이 있습니다. 맨 위의 숫자에서 시작해, 한 번에 한 칸씩 아래로 내려가 맨 아래

algospot.com

 

풀이

종만북 난이도: 중

 

난이도는 중인 DP문제이지만 이전 단계를 풀었다면 쉬운 문제이다.

일단 이전 단계 문제인 삼각형 위의 최대 경로를 풀고오자.

 

최대 경로의 값을 구하는 문제는 아래와 같은 재귀함수로 해결이 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
int TriMaxSum(int r,int c){
  int& ret = cache_max[r][c];
  if(r == tri_size -1)
    return ret= triangle[r][c];
 
  if(ret != -1)
    return ret;
 
  ret = triangle[r][c]+ max(TriMaxSum(r+1 , c), TriMaxSum(r+1, c+1));
  return  ret;
}
cs

 

해당 함수를 통해 우리는 cache_max[r][c] 값이 cache_max[r+1][c]와 cache_max[r+1][c+1] 값 중에 더 큰 값과 자신의 위치인 triangle[r][c] 값을 더한 값을 저장하도록 만들었다.

cache_max[r][c] = triangle[r][c]+ max(TriMaxSum(r+1 , c), TriMaxSum(r+1, c+1))

 

우리는 이 cache_max를 이용하여 최대 경로의 개수를 구할 것이다.

 

int TriPathCnt(int r,int c) 는 r,c 위치에서 이동 가능한 최대 경로의 수를 반환한다.

cache_path[r][c]에 해당 위치에서 이동 가능한 최대 경로의 수를 저장한다고 하자.

 

 

(r,c)위치에서 분기가 가능한 최대 경로의 가지 수는 3가지이다.

 

1. cache_max[r+1][c] > cache_max[r+1][c+1]

 (r+1,c)만이, 즉 한 가지 경로만 최대 경로가 되므로 cache_path[r+1][c]의 값과 같다.

cache_path[r][c] = TriPathCnt(r+1, c)

 

2. cache_max[r+1][c] < cache_max[r+1][c+1]

 (r+1,c+1)만이 최대 경로가 되므로 cache_path[r+1][c+1]의 값과 같다.

cache_path[r][c] = TriPathCnt(r+1, c+1)

 

2. cache_max[r+1][c] == cache_max[r+1][c+1]

 (r+1,c)와 (r+1,c+1)두 경로가 모두 최대 경로가 되므로 cache_path[r+1][c] + cache_path[r+1][c+1]의 값과 같다.

cache_path[r][c] = TriPathCnt(r+1, c) + TriPathCnt(r+1, c+1)

 

 

코드

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함