DP 알고리즘 학습
핵심조건
1. 마지막 계단 밟아야함
2. 1,2칸 오를 수 있음
3. 연속 3칸 x
접근 방식
1. 상태 정의
dp[i] = i번째 계단을 밟았을때의 최대 점수

#dp 초기값 설정
#점화식
#1. 계단 점수 입력 받기
import sys
input = sys.stdin.readline
N = int(input())
score = [0] *(N+1)
for i in range(1, N+1):
score[i] = int(input())
dp = [0] * (N+1)
#초기값
dp[0] = 0
dp[1]= score[1]
dp[2] = score[2]
#점화식
for i in range(3, N+1):
dp[i] = max(score[i] + dp[i-2], score[i] + score[i-1] + dp[i-3])
print(dp[N]]
=> 조건 분기 x dp[2] = score[1] + score[2]
import sys
input = sys.stdin.readline
N = int(input())
score = [0] + [int(input()) for _ in range(N)]
#print(score)
dp = [0] * (N+1)
#초기값 별도 처리 !!
if N >= 1:
dp[1] = score[1]
if N >=2:
dp[2] = score[1] + score[2]
#점화식
for i in range(3, N+1):
dp[i] = max(score[i] + dp[i-2], score[i] + score[i-1] + dp[i-3])
print(dp[N])
핵심 조건
알고리즘
dp[i] = i장을 만들기 위해 지불할 수 있는 최대 금액
점화식으로 표현
dp[i] =j는 1~i까지 증가
dp[i] = dp[i-j] + lst[j]임.
-> 나중에
이분 탐색
정수 N이 주어졌을때 어떤 정수 X의 제곱이 N이상이 되는 가장 작은 X 구하기. X^2 >=N을 만족하는 최소 X찾기
브루트포스 -> 시간 초과
logN 수준의 알고리즘 -> 이분 탐색 알고리즘.
#변수
left = 0, right = N
mid 변수
#조건 분기
N = int(input())
left = 0
right = N
while left <=right:
mid= (left + right) //2
if mid* mid >= N:
result = mid
right = mid-1
else:
left = mid+1
print(result)
이분탐색 + 그리디
-> 이해 x
N = int(input())
lst = list(map(int, input().split()))
#길이 1로 초기화
dp = [1] * N
for i in range(N):
for j in range(i):
dp[i] = max(dp[i], dp[j] +1)
result = max(dp)
print(result)