출처 : https://www.acmicpc.net/problem/1005

정답 : https://github.com/stemp12/study/blob/master/acmicpc.net/2016.07/1005.cpp


이 문제는 참 그렇다. 이렇게 많이 틀린 문제가 있엇던가 싶다. 

그래도 이번엔 정답을 맞았다. 1년전에 도전했고 9개월전 6일전 1일전 도전하여 결국 풀어냈는데 생각해보면 이 단순한걸 왜틀렸을까? 왜생각을 못했을까 싶다..

위상정렬이라는것이 필요하다고 하여 공부해보았고 참 요긴하게 쓰이겠구나 했지만, 위상정렬이라는 개념을 모르더라도 DP와 dfs만 안다면 풀 수 있는 문제였다. 

결국은 최장길이를 구하는 문제인데 dfs로 전부 탐색해서 구했다.

풀이는 다음과 같다.

1. 인풋을 입력받지만 나는 벡터에 값을 담을때 반대로 담았다.

2. 찾고자하는 건물번호를 입력을 받으면 그 지점에서부터 시작을 하였다.

3. 그리고 dp[now] 에 값이 있다면 그값을 리턴하고 아니라면 dp[now]에 현재 arr[now]값을 주고 계산을 시작하였다.

그런데 여기서 계산을 한다.

4. 포문을 열고 현재 녀석과 연결된 녀석을 살펴보고 해당녀석을 다시 dfs로 작업을 시작한다.

그럼 결국 여기저기 찾으러 다닐텐데 만약 dp[now] 값이 존재하면 이미 만든 값이므로 그 값을 사용할테고 그값을 사용하면서+val이 크다면 그 구한값에 +val만하여 사용하고 아니면 그냥 쓰는식이다. 

간단한 문제라고 생각되는데 왜이리 해맸는지 모르겠다. 

가만보면 난 이런 dp+dfs에는 알면서 자주틀리는거같다. 나중에 다시풀어보거나 비슷한 문제를 다시 접해봐야겠다. 

'Algorithm' 카테고리의 다른 글

[AC] 1613 역사  (1) 2016.08.03
[AC] 1298 노트북의 주인을 찾아서  (0) 2016.08.03
[AC] 6549 히스토그램에서 가장 큰 직사각형  (0) 2016.07.25
[AC] 1021 회전하는 큐  (0) 2016.07.25
[AC] 1780 종이의 개수  (0) 2016.07.25

+ Recent posts