본문 바로가기

dynamic programming11

[Python]2225. 합분해 https://www.acmicpc.net/problem/2225 2225번: 합분해 첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 2차원 DP로 접근하면 쉽게 해결할 수 있는 문제였다. 조건에서 0 2019. 4. 8.
[Python]1699. 제곱수의 합 https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 www.acmicpc.net dp[i-1] 이 아닌 dp[i-j^2] 을 이용해서 제곱수의 합을 DP로 구현하는 것이 포인트. dp[i] = min(dp[i-j^2.. 2019. 4. 7.
[Python]13398. 연속합 2 https://www.acmicpc.net/problem/13398 13398번: 연속합 2 첫째 줄에 정수 n(1≤n≤100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 하나 제거할 때의 연속합의 최대값이란, 특정 시점 (i) 를 기준으로 앞에서부터의 연속합 중 (i-1) 위치와 뒤에서부터의 연속합 중 (i+1) 위치의 연속합의 합이다. 다시말해, dp2[i] = dp[i-1]+dr[i+1], 단 1 2019. 4. 7.
[Python]14002. 가장 긴 증가하는 부분 수열 4 (LIS) https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net 핵심아이디어는 변경시킨 인덱스를 별도의 배열에 저장하여 역추적 하는 것(v 에 저장 후 역추적). n = int(input()) a = [0]+list(map(int, input().split())) DP = [0]*(n+1) v = [-1]*(n+1) for i in range(1,n+1): f.. 2019. 4. 5.
[Python]11053. 가장 긴 증가하는 부분 수열 (LIS) https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net 아이디어를 떠올리기 어려웠다. LIS 는 굉장히 중요한 문제이므로 연습이 필요하다. 정답은 부분수열이므로, 특정 시점에서 (i) 에서 맨 앞쪽까지 크기 비교를 수행한 뒤, 가장 큰 길이(DP 값)를 구해서 마지막에 자기자신(+1)을 더한다. 즉 D[i] = max(D[i-1], D[i-2], ... .. 2019. 4. 5.
[Python]2156. 포도주 시식 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다. 효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고 www.acmicpc.net 1차원 DP 1234567891011121314n = int(input())WINE = [0]+[int(input()) for _ i.. 2019. 4. 4.
[Python]9465. 스티커 https://www.acmicpc.net/problem/9465 9465번: 스티커 문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점 www.acmicpc.net 고민하다가 강의를 듣고 푼 문제. 풀면서 배운 점 1. 굳이 DP의 index를 가지고 상태 표현을 다 할 필요가 없다. 기존 방법, i .. 2019. 4. 4.
[Python]10844. 쉬운 계단 수 https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 계단이라는 특성으로 인해서 문자열 비교 없이 DP를 이용해서 풀 수 있다. 단, 2차원 DP를 이용하는 것이 편리하다. 점화식으로 풀어보면 다음과 같다. DP[i][0] = DP[i-1][1] DP[i][1] = DP[i-1][0] + DP[i-1][2] DP[i][2] = DP[i-1][1] + DP[i-1][3] ... DP[i][8] = DP[i-1][7] + DP[i-1][9] DP[i][9] = DP[i-1][8] DP[1]을 미리 초기화하여 별도의 예외처리를 하지 않는다. 1 2 3 4 5 6 7 8.. 2019. 4. 4.
[Python]15990. 1,2,3 더하기 5 https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 1차원의 DP로 풀 수 있긴 한데.. 시간이 매우매우 많이 걸린다..!! 문제 조건에 따르면 끝 자리 수와 비교하여 다를때만 연산을 해줘야 하기 때문. 따라서 2차원 DP 를 이용해서 조건을 쪼개본다. DP[i][1] = DP[i - 1][2] + DP[i - 1][3] # 현재 1은 1단계 전의 2 또는 3 에 붙을 수 있다. DP[i][2] = DP[i - 2][1] + DP[i - 2][3] # 현재 2은 2단계 전의 1 또는 3 에 붙을 수.. 2019. 4. 3.
728x90
반응형