김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • KMU_WINK
  • ㄱ
  • Remote저장소
  • 로컬저장소
  • GitHubDesktop
  • local저장소
  • 원격저장소
  • 깃허브데스크탑

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

•알고리즘(Algorithm )/문제풀이

[백준11054&파이썬] dp를 두번 이용하여 문제를 해결하자

2023. 6. 3. 22:53

# 문제

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.acmicpc.net

# 코드

import sys

n = int(sys.stdin.readline().strip())
arr = list(map(int,sys.stdin.readline().split()))

# print(arr)
# 왼쪽부터 증가하는 수열을 구한다.
dpL = [1] * n
for pivot in range(n) :
  for i in range(pivot) :
    if arr[i] < arr[pivot] :
      dpL[pivot] = max(dpL[pivot], dpL[i] + 1)
# print(dpL)

# 오른쪽부터 증가하는 수열을 구한다.
dpR = [1] * n
for pivot in range(n-1,-1,-1) :
  for i in range(n-1,pivot,-1) :
    if arr[i] < arr[pivot] :
      dpR[pivot] = max(dpR[pivot], dpR[i]+1)
# print(dpR)

# dpL과 dpR의 합을 구한뒤 -1을 하자
 # 1의 값은 중복되기 때문에 빼줘야 한다
for i in range(len(dpL)) :
  dpR[i] = dpL[i] + dpR[i]

print(max(dpR)-1)


# 풀이

 

[백준11053&파이썬] DP를 이용하여 반복문을 하나 줄일 수 있다.

# 문제 백준11053 가장 긴 증가하는 부분 수열 파이썬 풀이 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수

devforyou.tistory.com

  • 가장 긴 부분수열을 구하는 문제를 그대로 응용 한다면 쉽게 풀 수 있다.
  • 특정 수 S(k)에서 왼쪽과 오른쪽 모두 가장 작은 수들로 수열을 만들어야 한다.
  • 두 방향으로 하여금 S(k)보다 작은것들의 개수를 DP를 활용하여 세어준다.
  • 왼쪽 한번 ==> dpL , 오른쪽 한번 ==> dpR을 수행하고 dpL과 dpR을 더해준 후 1을 뺴줘야 한다.
  • 1은 겹치기 때문이다.
저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준17070&파이썬] State를 통해서 파이프의 이동방향을 다각화 하기  (0) 2023.06.06
[백준12865&파이썬] 0-1 냅색문제(배낭문제)  (0) 2023.06.05
[백준11053&파이썬] DP를 이용하여 반복문을 하나 줄일 수 있다.  (0) 2023.06.01
[백준2096&파이썬] DP와 슬라이딩 윈도우를 이용하기  (0) 2023.05.30
[백준5639&파이썬] BST의 preorder를 postorder로 변환하는 방법  (0) 2023.05.29
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준17070&파이썬] State를 통해서 파이프의 이동방향을 다각화 하기
    • [백준12865&파이썬] 0-1 냅색문제(배낭문제)
    • [백준11053&파이썬] DP를 이용하여 반복문을 하나 줄일 수 있다.
    • [백준2096&파이썬] DP와 슬라이딩 윈도우를 이용하기
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바