이번에 풀어본 문제는
백준 11055번 가장 큰 증가 부분 수열 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int [] dp,map;
static int max_value = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
dp = new int[N];
map = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; ++i)
{
int cur = Integer.parseInt(st.nextToken());
map[i] = cur;
dp[i] = cur;
int tmp = 0;
for(int j = 0; j < i; ++j)
{
if(cur > map[j])
{
tmp = Math.max(tmp,dp[j]);
}
}
dp[i] += tmp;
max_value = Math.max(max_value,dp[i]);
}
System.out.print(max_value);
}
}
주어진 N길이의 수열에서, 증가하는 수열이면서 합이 최대인 부분수열의 합을 출력하는 문제입니다. 1차원 dp배열을 활용하여, 현재 입력된 값보다 작으면서, dp에 누적된 합이 가장 큰 인덱스를 찾아, 현재 dp값을 갱신해주면 됩니다.
최종 탐색을 생략하기 위해 매 반복마다 max_value를 갱신해주어 최댓값을 담아, 마지막에 출력하도록 해보았습니다.
앞서 의도와 다르게 bfs문제를 풀어버려서, 다른 dp문제를 풀어보았습니다.
이런 문제보다는 점화식을 구해야하는 dp문제에 취약한 것 같아요ㅠ 제가 어렵게 느끼는 유형의 문제를 찾아 다시 풀어볼 생각입니다.