안녕하세요~ 알고라파덕입니다~
이번 문제는 동적 계획법 관련 문제입니다.
동적 계획법은 처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산하고, 이 답들로부터 원래 문제에 대한 답을 계산해 내는 방법입니다.
LIS
(출처 : https://algospot.com/judge/problem/read/LIS)
어떠한 수열이 주어졌을 때 부분 증가 수열 중에서 가장 긴 부분 증가 수열의 길이를 구해야하는 문제입니다.
3 1 2 4 7 5 6 8 10 이라는 수열이 만약에 주어진다면 이 수열의 최대부분증가수열은
1 2 4 5 6 8 10이 됩니다.
그렇다면 어떻게 이 문제를 동적계획법으로 해결을 해야 할까요??
먼저 이 LIS문제의 특성을 찾아봅시다.
첫 번째 특징은 수열의 시작점이 어느 곳에서나 가능하고 수열의 마지막 또한 어느 곳에서나 가능합니다.
두 번째 특징은 수열의 어느 위치에서 최대 부분 증가수열을 구할 때 항상 그 전에서 현 위치까지의 최대부분 증가수열을 가지고 갈 수 있다는 것 입니다.
3 1 2 4 7 5 6 8 10
3 1 1 1 2 2 2 2 2 2 -> 3을 시작점으로 할 때 한 칸 이동
1 1 1 2 2 2 2 2 2 2 -> 1을 시작점으로 할 때 한 칸 이동
2 1 1 2 3 3 3 3 3 3 -> 2을 시작점으로 할 때 한 칸 이동
4 1 1 2 3 4 4 4 4 4 -> 4을 시작점으로 할 때 한 칸 이동.
7 1 1 2 3 4 4 4 5 5
5 1 1 2 3 4 4 5 5 5
6 1 1 2 3 4 4 5 6 6
8 1 1 2 3 4 4 5 6 7
10 1 1 2 3 4 4 5 6 7
점화식 : data[i] < data[j] -> if(sum[i][i] + 1 > sum[i-1][j])
sum[i][j] = sum[i][i] + 1;
else
sum[i][j] = sum[i-1][j];
else
sum[i][j] = sum[i-1][j];
맨 마지막 줄에서 가장 큰 값을 찾아낸다.
'알고스팟 풀이 > 동적계획법' 카테고리의 다른 글
[알고스팟/ALGOSPOT] 17. TILING2 (0) | 2015.07.01 |
---|---|
[알고스팟/ALGOSPOT] 16. JLIS (0) | 2015.06.25 |
[알고스팟/ALGOSPOT] 14. TRIANGLEPATH (0) | 2015.06.23 |
[알고스팟/ALGOSPOT] 10. PACKING (0) | 2014.12.07 |
[알고스팟/ALGOSPOT] 8. CONCERT (0) | 2014.12.07 |