다이나믹프로그래밍

·문제풀이/DP
https://www.acmicpc.net/problem/10164코드n, m, k = map(int, input().split())def find_path(r, c): # 세로 길이가 r, 가로 길이가 c인 격자에서 경로의 개수 구하기 dp = [[0]*(c) for _ in range(r)] dp[0][0] = 1 for i in range(r): for j in range(c): if i+1  풀이목적지까지 경로의 개수 구하는데 중간에 꼭 경유해야 하는 곳이 있다면 다음과 같이 출발지-경유지까지 가는 길과 경유지-목적지까지 가는 길의 경로의 수를 각각 구해서 곱하면 된다.1번이 출발지, 15번이 목적지, 8번이 경유지라면 (1번에서 8번까지 가는..
·문제풀이/DP
https://www.acmicpc.net/problem/17212 코드n = int(input())dp = [int(1e9)]*(n+1) # dp[i]: i원 만드는 데 필요한 동전의 최소 개수dp[0] = 0for i in range(1, n+1): for j in [1, 2, 5, 7]: if i-j
·문제풀이/DP
https://www.acmicpc.net/problem/20364코드from collections import dequeimport sysinput = sys.stdin.readlinen, q = map(int, input().split())dp = [-1]*(n+1) # dp[i]는 1번에서 i번까지 가는 길에 가장 처음 마주치는 점유된 땅 번호for i in range(q): want = int(input()) if dp[want] == -1: # 가는 길에 이미 점유된 땅이 없음 # 이 땅 아래로는 다 이 땅을 지나야만 한다고 표시 q = deque([want]) while q: now = q.popleft() ..
·문제풀이/DP
https://www.acmicpc.net/problem/5569 코드w, h = map(int, input().split())dp = [[[0]*4 for _ in range(h)] for _ in range(w)]# 값 초기화for i in range(1, w): dp[i][0][1] = 1for j in range(1, h): dp[0][j][3] = 1for i in range(1, w): for j in range(1, h): dp[i][j][0] = dp[i-1][j][3] # 계속 오른쪽으로 가다가 이번에 위로 온 경우 dp[i][j][1] = (dp[i-1][j][0]+dp[i-1][j][1]) % 100000 # 계속 위로 dp..
·문제풀이/DP
https://www.acmicpc.net/problem/15990 코드dp = [[0]*3 for _ in range(100001)] # 1열은 이번에 1 더했을 때, 2열은 2, 3열은 3 더했을 때dp[1][0] = 1dp[2][1] = 1dp[3] = [1, 1, 1]for i in range(4, 100001): dp[i][0] = (dp[i-1][1]+dp[i-1][2]) % 1_000_000_009 dp[i][1] = (dp[i-2][0]+dp[i-2][2]) % 1_000_000_009 dp[i][2] = (dp[i-3][0]+dp[i-3][1]) % 1_000_000_009for _ in range(int(input())): n = int(input()) pr..
딜레이레이
'다이나믹프로그래밍' 태그의 글 목록