dp

· 백준
코드1 def fibo(x): x = abs(x) if x == 0: return 0 a,b = 0, 1 for _ in range(2, x+1): a,b = b, a+b return b n = int(input()) res = fibo(n) if res == 0: print(0) elif n < 0 and abs(n)%2 ==0: print(-1) else: print(1) print(res%1000000000) 파이파이로 겨우 통과한 코드이다. 메모리 초과에 대한 해답을 찾기 위해 2개만 저장했는데, 훨씬 좋은 방법이 있었다. 또 이를 뒷받침하는 근거도 첨부했으니 문제 풀 때마다 기억하면서 해결해봐야겠다. 코드2 def fibo(x): x = abs(x) if x == 0: return 0 table..
· 백준
코드 tc = int(input()) for _ in range(tc) : # 테스트 케이스 반복 n = int(input()) dp = [list(map(int,input().split())) for _ in range(2)] # dp테이블 작성 if n > 1 : # n이 1보다 크면 대각선 값을 더해준다. dp[0][1] += dp[1][0] dp[1][1] += dp[0][0] for i in range(2,n) : # 2이상인 경우, 대각선으로 1칸 이상 떨어진 경우 또는 거기서 1칸 건너뛴 경우 중 큰 값을 더해준다 dp[0][i] += max(dp[1][i-1],dp[1][i-2]) dp[1][i] += max(dp[0][i-1],dp[0][i-2]) print(max(dp[0][n-1],d..
· 백준
코드 # 시간제한이 0.15초이고 각각의 경우 있을 수 있는 케이스를 모두 살펴보아야 한다. # dp가 적격 # Tabulation 방식 def findcnt(n): dp = [0]*(n+1) # 개수를 세어주기 위한 dp 테이블을 만든다 for i in range(2, n+1): # 아래에서부터 구한다. if i%6 == 0: dp[i] = min(dp[i//3], dp[i//2])+1 # 6의 배수인 경우, dp[i//3], dp[i//2] 중 작은 값을 찾아 1을 더해준다. # 이 경우에서 dp[i-1]인 경우가 제외된 이유는 2의 배수, 3의 배수보다 값이 크기 때문이다. elif i%2 == 0: dp[i] = min(dp[i//2], dp[i-1])+1 # 2의 배수인 경우, dp[i//2],..
DP 도대체 이름이 왜 동적 계획법인지 궁금한 알고리즘이다. 지금까지 봤을 때는 점화식 세우기가 핵심인 알고리즘인 거 같다. 동적 계획법이란 최적화 이론의 기술로 특정 범위까지의 값을 구하기 위해 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계방법이다. 문제를 부분 문제로 나누어 각 부분 문제의 답을 계산하고, 이 계산한 결과값을 이용해 원래 문제의 답을 산출한다. 연산 횟수를 기가 막히게 줄여주며 이에 따라 시간복잡도가 개선되는 장점을 가지고 있다. DP를 적용하기 위한 2가지 조건 동적 프로그래밍에 대해 찾아보는데 공통점이 여럿 있었다. DP를 사용하기 위해서는 두 가지 조건이 충족되어야 한다는 것이다. 1. 최적 부분 구조 - 전체 문제의 답을 부분 문제의 답을 이용하여 ..