파이썬 알고리즘-74 (DP) 최대 선 연결하기
74.최대 선 연결하기
왼쪽의 번호와 오른쪽의 번호가 있는 그림에서 같은 번호끼리 선으로 연결하려고 합니다. 왼쪽번호는 무조건 위에서부터 차례로 1부터 N까지 오름차순으로 나열되어 있습니다. 오른쪽의 번호 정보가 위부터 아래 순서로 주어지만 서로 선이 겹치지 않고 최대 몇 개의 선을 연결할 수 있는 지 구하는 프로그램을 작성하세요.
위의 그림은 오른쪽 번호 정보가 4 1 2 3 9 7 5 6 10 8 로 입력되었을 때 선이 서로 겹치지 않고 연결할 수 있는 최대 선을 개수 6을 구한 경우입니다.
▣ 입력설명
첫 줄에 자연수 N(1<=N<=100)이 주어집니다.
두 번째 줄에 1부터 N까지의 자연수 N개의 오른쪽 번호 정보가 주어집니다. 순서는 위쪽번호부터 아래쪽번호 순으로입니다.
▣ 출력설명
첫 줄에 겹치지 않고 그을 수 있는 최대선의 개수를 출력합니다.
▣ 입력예제 1
10
4 1 2 3 9 7 5 6 10 8
▣ 출력예제 1
6
내 코드
n=int(input())
right=list(map(int, input().split()))
res=0
dy=[0]*(n+1)
dy[0]=1
for i in range(1,n) :
max=0
for j in range(i-1,0,-1):
if right[j]<right[i] and dy[j]>max:
max=dy[j]
dy[i]=max+1
if dy[i]>res:
res=dy[i]
print(res)
바로 전에 풀었던 최대 부분 증가 수열과 똑같은 유형의 문제이다. 결국 오른쪽에서 최대 부분 증가 수열을 구하는 방식이므로 코드도 완전히 동일하다.
풀이
n=int(input())
arr=list(map(int, input().split()))
arr.insert(0,0)
dy=[0]*(n+1)
dy[1]=1
res=0
for i in range(2, n+1):
max=0
for j in range(i-1, 0, -1):
if arr[j]<arr[i] and dy[j]>max:
max=dy[j]
dy[i]=max+1
if dy[i]>res:
res=dy[i]
print(res)
반성점
- 구현방법이 안떠올라서 결국 저번 문제를 참고할 수밖에 없었음
배운 것
Author And Source
이 문제에 관하여(파이썬 알고리즘-74 (DP) 최대 선 연결하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jiffydev/algo-74저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)