❓문제
❗문제 정리
📑코드
n=int(input())
stairs=[]
for i in range(n):
stairs.append(int(input()))
dp=[0]*301
if n==1:
print(stairs[0])
elif n==2:
print(sum(stairs))
else:
dp[0]=stairs[0]
dp[1]=dp[0]+stairs[1]
dp[2]=max(stairs[1]+stairs[2],dp[0]+stairs[2])
for i in range(3, n):#마지막칸 무조건 밟으니까 이전칸인 n-1까지만
dp[i]=max(dp[i-3]+stairs[i-1]+stairs[i],dp[i-2]+stairs[i])#dp[i-1] : 한칸 뛰어옴, dp[i-2]: 두칸 뛰어옴
print(dp[n-1])
📝코드 설명
n=int(input())
stairs=[]
for i in range(n):
stairs.append(int(input()))
dp=[0]*301
계단수 n, 계단 stairs 입력받기
dp테이블 만들어주기 - 최대 300개 이하의 계단이 있다고 하였으므로 dp테이블의 크기를 301로 설정.
여기서 dp테이블은 해당 인덱스번째까지 올라갔을때 점수의 최댓값!
if n==1:
print(stairs[0])
elif n==2:
print(sum(stairs))
계단이 1개인경우 입력받은 계단에 올라가면 되므로 그대로 출력
계단이 2개인경우 최대 점수를 받으려면 있는 계단 2개를 모두 밝으면 된다. 전부 더해주기
else:
dp[0]=stairs[0]
dp[1]=dp[0]+stairs[1]
dp[2]=max(stairs[1]+stairs[2],dp[0]+stairs[2])
for i in range(3, n):#마지막칸 무조건 밟으니까 이전칸인 n-1까지만
dp[i]=max(dp[i-3]+stairs[i-1]+stairs[i],dp[i-2]+stairs[i])#dp[i-1] : 한칸 뛰어옴, dp[i-2]: 두칸 뛰어옴
print(dp[n-1])
계단이 3개 이상인 경우 점화식 사용!!
💡내가 현재 계단에 서있는다고 생각하고 이전계단에서 어떻게 왔는지를 생각하기
1. 0번째 계단은 무조건 밟고 들어가기
2. 1번째 계단은 0번째 계단(이미 밟은 계단)의 점수에 현재 밟은 계단(1번째 계단)을 넣어주기
3. 2번째 계단은 1. 바로 다음 계단을 밟은다 2. 앞앞계단을 밟는다
3-1. 바로 다음 계단을 밟는 경우 : 이미 밟은 1번째 계단 + 현재 밟은 계단(2번째 계단)의 점수
3-2. 두칸 떨어진 계단을 밟는 경우 : 0번째 계단에서 2칸 떨어진 곳이 2번째 계단임.따라서, 0번째 계단의 점수와 현재 계단의 점수를 더함.
dp[2]=max(stairs[1]+stairs[2],dp[0]+stairs[2])
dp[i]=max(stairs[i-1]+stairs[i],dp[i-2]+stairs[i])
(바로 다음 계단을 밟는 경우, 2칸 떨어진 계단을 밟는 경우)
i=3이면, max(dp[0]+stairs[2]+stairs[3], dp[1]+stairs[3])
🎖제출 결과
💡insight
반례 : https://www.acmicpc.net/board/view/102597
헷갈렸던게, 최소로 이동해서 최댓값을 내는거라고 착각함!!!