-문제:https://www.acmicpc.net/problem/1309

처음에 n=1,2,3,4일 때 값을 3,7,15,38으로 구해서 점화식을 못 구했지만

다시 갯수 세보니 3,7,17,41이어서 f(n)= 2*f(n-1)+f(n-2)의 점화식을 구했다

답을 구한후 9901로 나눠줘야한다

-정답풀이 1:

n=int(input())
dp=[0 for _ in range(n+1)]
dp[0]=1
dp[1]=3

if n==1:
    print(dp[1])
else:
    for i in range(2,n+1):
        dp[i]=(2*dp[i-1]+dp[i-2])%9901
    
    print(dp[n])

-정답풀이 2: 

n=int(input())
dp=[0 for _ in range(100001)]
dp[1]=3
dp[2]=7

for i in range(3,n+1):
    dp[i]=(2*dp[i-1]+dp[i-2])%9901
    
print(dp[n])

 

 

이렇게 풀면 indexerror난다. n==1일 때는 dp=[0,0]으로 인덱스가 1까지 밖에 없는데, 네번째줄에 인덱스 2에 7을 넣기 때문에 indexError가 날 수 밖에 없다.

아래처럼 하고 싶다면 dp를 n+1개의 원소만 생성하는 것 대신, dp=[0]*100001로 초기화하고, dp[-1]이 아닌 dp[n]을 출력하면된다.

n=int(input())
dp=[0]*(n+1)
dp[1]=3
dp[2]=7

for i in range(3,n+1):
    dp[i]=(2*dp[i-1]+dp[i-2])%9901
    
print(dp[-1])

 

'백준 > DP' 카테고리의 다른 글

[dp/백준] 1890번: 점프  (0) 2022.06.17
[dp/백준] 2565번: 전깃줄  (0) 2022.06.17
[dp/백준] 2225번: 합분해  (0) 2022.06.16
[dp/백준] 2294번: 동전2  (0) 2022.06.16
[dp/백준] 1520번: 내리막길  (0) 2022.06.13

+ Recent posts