7/29 연습

2017. 7. 30. 10:50알고리즘 문풀/BOJ 연습

2969. 메뚜기 (COCI 08/09 Contest #1 5번)


문제 : http://icpc.me/2969


오래전에 친구가 교내 대회에 냈던 문제인데, 그때 아무생각없이 O(n4)O(n^4)이랑 O(n3)O(n^3) 생각하고 끝냈던 문제.


일단 dp[i][j]dp[i][j](i,j)(i,j)에서의 최장 경로라고 하자. 이제 각각 nn개씩의 행/열에 대해서 dpdp값과 좌표를 저장해두는 자료구조를 만든다.

높이가 낮아지는 순서대로 탐색하면서, i+1열, i-1열, j-1열, j+1열에 저장된 dp값들 중 조건을 만족하면서 가장 큰 dp값을 DD라고 하면, dp[i][j]=D+1dp[i][j]=D+1이 된다. 

자료구조를 맨 처음에는 set으로 했는데, set을 허투루 썼더니 메모리 초과가 났다(...) 여윽시 set/map은 사회악 (heap으로 했으면 AC가 났을지도?)

여기서 시간을 줄일 수 있는 아이디어는 한 행/열에서 dp값이 가장 큰 4개의 값만 들고 다니면, 그 4개 중에 문제의 까다로운 좌표 조건을 만족하는 놈이 반드시 존재한다는 것이다. 그래서 자료구조는 그냥 한 열당 4개짜리 배열로 충분하다.

여기서 한 가지 신경써줘야 할 점은 높이가 같은 점은 한 열에 최대 nn개까지 존재할 수 있으므로, 이걸 고려하지 않고 바로 자료구조에 현재 dp값을 삽입하면 WA를 받게 된다. 높이가 같은 점들끼리는 따로 tmptmp같은 벡터에 저장해 두었다가 높이가 달라지는 순간 tmptmp를 비우면서 자료구조에 넣어주어야 한다.


Time Complexity : O(sort(n2)+n2) =O(n2lgn)O(\text{sort}(n^2)+n^2) = O(n^2 \lg n)



'알고리즘 문풀 > BOJ 연습' 카테고리의 다른 글

8/1 연습  (0) 2017.08.02
7/30 ~ 7/31 연습  (0) 2017.08.01
7/27~7/28 연습  (0) 2017.07.29
7/26 연습  (0) 2017.07.27
7/25 연습  (0) 2017.07.26