-
BOJ) 가장 긴 감소하는 부분 수열알고리즘/백준 2020. 8. 1. 23:47반응형
가장 긴 감소하는 부분 수열
풀이
가장 긴 감소하는 부분 수열을 구하는 문제다.
Longest Increasing Subsequence와 조건만 다른 Longest Decreasing Subsequence 문제다.
LIS 문제의 조건을 반대로만 해주면 쉽게 풀 수 있다.
우선, int[] 배열 dp를 선언했다.그리고, 순회하는 인덱스의 다음 인덱스부터 n까지 돌면서 순회하고있는 인덱스의 dp +1과 비교군 dp의 max를 최신화했다.Math.max(dp[i]+1, dp[j])물론, 최신화는 순회하는 인덱스의 값보다 작은 값에 대해서만 진행한다.하나의 인덱스에서 n까지 비교가 끝나면, dp[i]와 answer를 비교하며 최대값을 구해서 답을 구해줬다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); int[] numArr = new int[n]; for(int i=0; i<n; i++) { numArr[i] = Integer.parseInt(st.nextToken()); } br.close(); solution(n,numArr); } private static void solution(int n, int[] numArr) { int[] dp = new int[n]; int answer =0; for(int i=0; i<n; i++) { dp[i] = Math.max(dp[i], 1); for(int j = i+1; j<n; j++) { if(numArr[i] > numArr[j]) dp[j] = Math.max(dp[j], dp[i]+1); } answer = Math.max(answer, dp[i]); } System.out.println(answer); } }
반응형'알고리즘 > 백준' 카테고리의 다른 글
BOJ) 이동하기 (0) 2020.08.02 BOJ) 촌수 계산 (0) 2020.08.01 BOJ) 동전 2 (0) 2020.07.27 BOJ) 가장 긴 증가하는 부분 수열 (LIS, Longest Increasing Subsequence) (0) 2020.07.27 BOJ) 가장 큰 증가 부분 수열 (0) 2020.07.26