본문 바로가기

BOJ 알고리즘 (패캠)/DP

(6)
2655번: 가장높은탑쌓기 LIS (DP) - Fastcampus www.acmicpc.net/problem/2655 2655번: 가장높은탑쌓기 첫째 줄에는 입력될 벽돌의 수가 주어진다. 입력으로 주어지는 벽돌의 수는 최대 100개이다. 둘째 줄부터는 각 줄에 한 개의 벽돌에 관한 정보인 벽돌 밑면의 넓이, 벽돌의 높이 그리고 무게가 차 www.acmicpc.net # dp[i] = i번째 벽돌을 가장 밑바닥 벽돌로 하는 탑의 최대높이 # (j번째 벽돌 = i번째 벽돌 위에 올릴수 있는 앞 수열의 더 작고 가벼운 벽돌) # # 인덱스,면적,높이,무게 # bricks = [(5,1,5,2),(3,9,2,3),(1,25,3,4),(4,16,2,5),(2,4,4,6)] # # dp[1] = {(5,1,5,2)} = 5 # dp[2] = {(5,1,5,2),(3,9,2,3)}..
1495번: 기타리스트 (DP) - Fastcampus www.acmicpc.net/problem/1495 1495번: 기타리스트 첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 1000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다. www.acmicpc.net # dp[i][j] = i번째 노래일때 j볼륨이 연주 가능한지 여부 # # data = [5, 3, 7] # # j=0 1 2 3 4 5 6 7 8 9 10 (볼륨) # 0 0 0 0 0 1 0 0 0 0 0 # i=1 (1번곡) 1 0 0 0 0 0 0 0 0 0 1 # i=2 (2번곡) 0 0 0 1 0 0 0 1 0 0 0 # i=3 (3번곡) 1 0 0 0 0 0 0..
9251번: LCS 가장 긴 공통 부분수열 (DP) - Fastcampus www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net # dp[i][j] = 공통 부분 문자열의 최대길이 # (i번째까지의 문자열, j번째까지의 문자열) # # dp[i][j] = (같은 값) 대각선 + 1 => dp[i-1][j-1] + 1 # (다른 값) 위 + 1 or 왼쪽 + 1 => max(dp[i-1][j] or dp[i][j-1]) # # C A P C A K # A 0 1 1 1 1 1 # C 1 1 1 ..
11053번: LIS 가장 긴 증가하는 부분수열 (DP) - Fastcampus www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net # dp[i] = i번째 수를 마지막 원소로 가지는 부분수열의 최대길이 # (j번째 수 = i번째 수와 연결되는 앞 수열의 작은 수) # # dp[i] = max(dp[j]) + 1, j < i # # nums = [10, 20, 10, 30, 20, 50] # # dp[0] = {10} = 1 # dp[1] = {10,20} = 2..
12865번: 평범한 배낭 (DP) - Fastcampus www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net # dp[i][j] = 배낭에 넣을수 있는 물건의 최대값 # (i번째 물건까지 j사이즈 배낭에 넣을때) # # dp[i][j] = max(물건이 안들어갈때의 가치, 물건의 가치 + 남은 공간의 가치) # = max(dp[i-1][j], v + dp[i-1][j-w]) # # (w, v) j=1 2 3 4 5 6 7 # i=1 (6, 13) 13 ..
1904번: 01타일 (DP) - Fastcampus www.acmicpc.net/problem/1904 1904번: 01타일 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이�� www.acmicpc.net # dp[i]: (길이 i) 타일을 만드는 경우의 수 # dp[i] = dp[i-2] + dp[i-1] def run(N): dp = [0] * max(N+1, 3) # 최소사이즈 dp[2]까지 설정 dp[1] = 1 dp[2] = 2 for i in range(3, N+1): dp[i] = (dp[i-1] + dp[i-2]) % 15746 return dp[N] N = int(input()) print(run(..