LIS와 반대로 LDS 의 문제이다. 이 문제 또한 DP로 풀 수 있다.
LIS와는 반대로 감소하는 수열이기 떄문에 N에 대한 값을 비교할 때는 비교하는 N의 값이 이 전 값보다 작을 때
조건을 만족하게 된다.
LIS를 풀었었다면 쉽게 LDS문제도 풀 수 있다.
코드로 보자면 아래와 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static Integer[] dp;
static int[] number;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
number = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 1; i <= N;i ++) {
number[i] = Integer.parseInt(st.nextToken());
}
// for(int i = N; i >= 0; i--) {
// recur_lds(i);
// }
bottom_up(N);
int max = Integer.MIN_VALUE;
for(int i = 1; i <= N; i++) {
max = Math.max(dp[i], max);
}
System.out.println(max);
}
static int recur_lds(int N) {
if(dp[N] == null) {
dp[N] = 1;
for(int i = N - 1; i >= 0; i--) {
if(number[N] < number[i]) {
dp[N] = Math.max(dp[N], recur_lds(i) + 1);
}
}
}
return dp[N];
}
static void bottom_up(int N) {
for(int i = 1; i <= N; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++) {
if(number[i] < number[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
}
}
static Integer[] dp;
static int[] number;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
number = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 1; i <= N;i ++) {
number[i] = Integer.parseInt(st.nextToken());
}
for(int i = N; i >= 0; i--) {
recur_lds(i);
}
static int recur_lds(int N) {
if(dp[N] == null) {
dp[N] = 1;
for(int i = N - 1; i >= 0; i--) {
if(number[N] < number[i]) {
dp[N] = Math.max(dp[N], recur_lds(i) + 1);
}
}
}
return dp[N];
}
int max = Integer.MIN_VALUE;
for(int i = 1; i <= N; i++) {
max = Math.max(dp[i], max);
}
System.out.println(max);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
number = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 1; i <= N;i ++) {
number[i] = Integer.parseInt(st.nextToken());
}
static void bottom_up(int N) {
for(int i = 1; i <= N; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++) {
if(number[i] < number[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
}
int max = Integer.MIN_VALUE;
for(int i = 1; i <= N; i++) {
max = Math.max(dp[i], max);
}
System.out.println(max);
이 문제는 그대로 보이는 것 기준으로 왼쪽으로 갈 수록 수가 커져야 하고, 오른쪽으로 갈 수록 수가 작아지는 것만 인식한다면 생각보다 쉽게 풀 수 있다.