티스토리 뷰
https://www.acmicpc.net/problem/2352
문제
도체를 설계할 때 n개의 포트를 다른 n개의 포트와 연결해야 할 때가 있다.
예를 들어 왼쪽 그림이 n개의 포트와 다른 n개의 포트를 어떻게 연결해야 하는지를 나타낸다. 하지만 이와 같이 연결을 할 경우에는 연결선이 서로 꼬이기 때문에 이와 같이 연결할 수 없다. n개의 포트가 다른 n개의 포트와 어떻게 연결되어야 하는지가 주어졌을 때, 연결선이 서로 꼬이지(겹치지, 교차하지) 않도록 하면서 최대 몇 개까지 연결할 수 있는지를 알아내는 프로그램을 작성하시오
입력
첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호, …, n번 포트와 연결되어야 하는 포트 번호가 주어진다. 이 수들은 1 이상 n 이하이며 서로 같은 수는 없다고 가정하자.
출력
첫째 줄에 최대 연결 개수를 출력한다.
예제 입력 1
6
4 2 6 3 1 5
예제 출력 1
3
해설
음. DP 로 풀었음.
4 2 6 3 1 5 로 예를 들면. 처음 연결은 (1, 4) 가 연결된다.
(1, 4)를 연결하면, 이후에 올 수 있는 숫자들은 4보다 큰 값들만 체크해야한다.(4보다 작으면 겹침)
따라서. 순차적으로 오른쪽 값들를 확인하면서 이전에 작은 값들이 있었는지 확인해야 한다.
예를 들어.
subLists에 둘 수 있는 최대 값을 기록한다.
(1, 4 ) 를 연결하면. 4는 1개 => subLists[4] = 1
(2, 2 ) 를 연결하면. 4 뒤에는 못오지만, 2 하나는 체크할 수 있다. => subLists[2] = 1
(3, 6) 을 연결하면, 6 보다 작은 숫자는 2와 4에 값중 큰 값에 추가할 수 있다. (2,4) 또는 (4, 6) => subLists[6] = max( subLists[2] + 1, subLists[4] + 1) = 2
(4, 3) 을 연결하면, 3 보자 작은 숫자는 2만 있음 => subLists[2] + 1 = 2
(5, 1 ) 을 연결하면, 1 보다 작은 숫자는 없으므로 => subLists[1] = 1
(6, 5 ) 를 연결하면, subLists[5] = max(subLists[1] , subLists[2], subLists[3], subLists[4]) + 1 = 3 이 된다.
이후 subLists 에 있는 값 중 가장 큰 값을 출력하면 된다 . => 3
하지만 이 방법으로 했을 때 역순으로 값이 있을 경우 n*n 만큼의 시간 복잡도가 걸린다.
greedy 로 풀지 못했다.
greedy 로 푸는 방법은 다음에 시도해봐야지
import sys
N = int(sys.stdin.readline())
datas = list(map(int,sys.stdin.readline().split(' ')))
subLists = [0 for i in range(N)]
for val in datas:
if (subLists[val-1] == 0) :
subLists[val-1] = 1
tmp_max = subLists[val-1]
for i in range(val):
if (subLists[i] > 0 and val-1 > i):
if (subLists[i] + 1 > tmp_max):
tmp_max = tmp_max + 1
subLists[val-1] = tmp_max
print(max(subLists))
# sample
N = 6
datas = list(map(int,"4 2 6 3 5 1".split(' ')))
subLists = [0 for i in range(N)]
for val in datas:
if (subLists[val-1] == 0) :
subLists[val-1] = 1
tmp_max = subLists[val-1]
for i in range(val):
if (subLists[i] > 0 and val-1 > i):
if (subLists[i] + 1 > tmp_max):
tmp_max = tmp_max + 1
subLists[val-1] = tmp_max
print(max(subLists))
'알고리즘' 카테고리의 다른 글
DFS와 BFS (0) | 2020.02.12 |
---|---|
그래프 탐색 알고리즘(Graph Traversals) (0) | 2020.02.12 |
[Greedy] 백준 회의실배정 1931 python3 풀이 (0) | 2020.02.05 |
[Greedy] 백준 잃어버린 괄호 1541 python3 풀이 (0) | 2020.02.05 |
[Greedy] 백준 ATM 11399 python3 풀이 (0) | 2020.02.05 |
- Total
- Today
- Yesterday
- minor GC
- 엑셀
- anaconda설치
- DP
- Open ID Connect
- nbconvert
- Markdown Note
- 인쇄열고정
- graph traversals
- 인쇄행고정
- unreachable object
- SecurityContextPersistenceFilter
- 메모리제한
- type명령어
- Python
- Excel
- Bruteforce
- ipynb
- 동시설치
- backtracking
- dynamic programming
- Divide&Conquer
- 이클립스메모리분석툴
- 스도쿠
- 여러 파일 하나로 합치기
- SecurityContextRepository
- ICPC
- Note App
- greedy
- anaconda2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |