Today's special moments become memories of tomorrow.

BOJ

[백준 2491번] 수열 (java)

lotus lee 2021. 3. 19. 19:16

 

2491번: 수열

0에서부터 9까지의 숫자로 이루어진 N개의 숫자가 나열된 수열이 있다. 그 수열 안에서 연속해서 커지거나(같은 것 포함), 혹은 연속해서 작아지는(같은 것 포함) 수열 중 가장 길이가 긴 것을 찾

www.acmicpc.net

 

dp 2차원 배열을 이용하여 다이나믹 프로그래밍으로 문제를 해결하였다.

이 문제에서의 점화식은 다음과 같다.

 

  • dp[n][0] : n번째 수열까지 중, 가장 긴 연속하는 증가하는 수열의 길이

  • dp[n][1] : n번째 수열까지 중, 가장 긴 연속하는 감소하는 수열의 길이

 

수열의 n번째 수를 n-1번째 수와 비교한다.

 

n-1번째 수 < n번째 수 

n-1번째 수가 더 작으므로 오름차순이 유지가 된다. 유지가 된다는 것은 n-1번째까지의 가장 긴 증가하는 

수열의 길이(dp[n-1][0])에서 n번째 수 본인을 더한 길이인 dp[n-1][0] + 1가 dp[n][0]에 들어간다.

반면, 내림차순은 n번째 수가 n-1번째 수보다 더 크므로, n번째 수를 시작으로 하는 길이가 1인 

내림차순이 된다. 

 

dp[n][0] = dp[n-1][0] + 1

dp[n][1] = 1 

 

n-1번째 수 > n번째 수

n-1번째 수가 더 크므로 내림차순이 유지가 된다. n-1번째까지의 가장 긴 감소하는 수열의 길이(dp[n-1][1])에서 n번째 수  본인을 더한 길이인 dp[n-1][1] + 1가 dp[n][1]에 들어간다.

반면, 오름차순의 경우, n번째 수가 n-1번째 수보다 작으므로, n번째 수를 시작으로 하는 길이가 1인 

오름차순이 된다. 

 

dp[n][0] = 1

dp[n][1] = dp[n-1][1] + 1 

 

 

n-1번째 수 == n번째 수

n-1번째 수와 n번째 수가 같으므로 오름차순도 유지가 되고, 내림차순도 유지가 된다.

따라서 오름차순의 경우, n-1번째까지의 가장 긴 증가하는 수열의 길이(dp[n-1][0])에 1을 더한 값이 dp[n][0]가 되고, 내림차순의 경우, n-1번째까지의 가장 긴 감소하는 수열의 길이(dp[n-1][1])에 1을 더한 값이 dp[n][1]이 된다.

 

dp[n][0] = dp[n-1][0] + 1 

dp[n][1] = dp[n-1][1] + 1 

 

 

 

소스코드 : 

 

'BOJ' 카테고리의 다른 글

[백준 1719번] 택배 (java)  (0) 2021.03.23
[백준 5670번] 휴대폰 자판 (java)  (0) 2021.03.21
[백준 1949번] 우수 마을 (java)  (0) 2021.03.19
[백준 1405번] 미친 로봇 (java)  (0) 2021.03.18
[백준 13458번] 시험 감독 (java)  (0) 2021.03.18