목록백준 문제 풀이 (154)
황소개발자
n = int(input()) dp = [[0 for i in range(10)] for j in range(n)] dp[0] = [1 for i in range(10)] for i in range(1, n): for j in range(10): for k in range(j, 10): dp[i][k] += dp[i - 1][j] print(sum(dp[-1]) % 10007) 우선 dp 배열 만들어주는데, 어떻게 만드냐면 [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]] 이런식으로 쌓이게끔 해서 마지막 배열 합계가 정답입니다. ( % 10007 잊지말구요) 해결 아이..
n = int(input()) dp = [0 for i in range(n + 1)] p = list(map(int, input().split())) for i in range(1, n+1): cost = 0 for j in range(1, i): sum = dp[j] * (i // j) if i % j != 0: sum += dp[i - j*(i//j)] if sum > cost: cost = sum if cost > p[i - 1]: dp[i] = cost else: dp[i] = p[i - 1] print(dp[n]) 자 이것도 다이나믹 하게 풀어야합니다. 다이나믹하게 풀 수 있도록 dp 배열을 만들고요. n이 주어졌을때, 1개만 사야한다 했을 때, max값은? 2개만 사야한다 했을 때, max값은..
Dd Dd n = int(input()) arr = list(map(int, input().split())) dp = [1] for i in range(1, n): big = 1 for j in range(0, i): if arr[j] big: big = dp[j] + 1 dp.append(big) big = 0 for i in range(n): if (dp[i] > big): big = dp[i] print(big)
점화식을 세우면 끝나는 문제이다. 점화식은 위와 깉이 세울 수 있으며, 코드 구현은 다음과 같다. n = int(input()) dp = [0, 1, 3] if n == 1: print(dp[1]) elif n == 2: print(dp[2]) else: for i in range(3, n + 1): dp.append(dp[i - 1] + dp[i - 2] * 2) print(dp[n] % 10007) 타일문제에 대해 더 이해하고 싶으면 아래글을 참고 바란다. 백준 2133 파이썬 python 타일 채우기 @@황소처럼 우직하게@@ n = int(input()) def sol(n): if n % 2 != 0: return 0 else: dp = [0] * (n + 1) dp[0] = 1 # 0줄인 경우는 ..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 n = int(input()) arr = [] for i in range(n): tmp = int(input()) arr.append(tmp) arr.sort(reverse = True) weight = 0 for i in range(n): if weight cs 로프 좋은놈부터 선택한다. 이제 안좋은걸 더 쓰려고할 때, 얘가 중량을 견딜 수 있는지 비교해준다.
1 2 3 4 5 6 7 8 9 10 11 12 price = int(input()) change = 1000 - price arr = [500, 100, 50, 10, 5, 1] count = 0 for i in arr: count += change // i change = change % i print(count) http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs 몫을 더해주고, 다음 for문으로 넘기기전에 나머지를 던져준다. 여기서 탐욕은 큰 동전부터 고려하는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 n = int(input()) arr = [] for i in range(n): tmp = list(map(int, input().split())) arr.append(tmp) arr.sort(key = lambda x: (x[1], x[0])) count = 0 end = 0 for i in range(n): if end
1 2 3 4 5 6 7 8 9 10 11 12 13 n, k = list(map(int, input().split())) arr = [] for i in range(n): a = int(input()) arr.append(a) count = 0 for i in range(n): count += k // arr[-1-i] k = k % arr[-1-i] print(count) 그리디 알고리즘. 탐욕스럽게 풀자. 동전값이 제일 큰거부터 본다. 동전값이 제일 큰거부터 내고 싶은 거다. 그래야 적게 동전을 적게 낼테니. 그 동전값으로 나눈 몫을 카운트시키고, 동전값으로 나눈 나머지를 다음으로 넘긴다.