dynamic programming 33

백준(Python) 1912번 연속합 풀이

Python으로 구현한 1912번 연속합 문제 풀이입니다. https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net import sys input = sys.stdin.readline n = int(input()) data = list(map(int, input().split())) dp = [i for i in data] for i in range(1, n) : dp[i] = max(dp[i], dp[i-1] + data[i]) print(max(dp)) 1. ..

백준(Python) 11054번 가장 긴 바이토닉 부분 수열 풀이

Python으로 구현한 11054번 가장 긴 바이토닉 부분 수열 문제 풀이입니다. https://www.acmicpc.net/problem/11054 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net import sys input = sys.stdin.readline a = int(input()) data= list(map(int, input().split())) increase = [1] * a decrease = [1] * a for i in range(a) : for j in range(i) : if data[j] < data..

백준(Python) 11722번 가장 긴 감소하는 부분 수열 풀이

Python으로 구현한 11722번 가장 긴 감소하는 부분 수열 문제 풀이입니다. https://www.acmicpc.net/problem/11722 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} www.acmicpc.net import sys input = sys.stdin.readline a = int(input()) data = list(map(int, input().split())) dp = [1] * a for i in range(a) : for j in..

백준(Python) 11055번 가장 큰 증가 부분 수열 풀이

Python으로 구현한 11055번 가장 큰 증가 부분 수열 문제 풀이입니다. https://www.acmicpc.net/problem/11055 11055번: 가장 큰 증가 부분 수열 수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수 www.acmicpc.net import sys input = sys.stdin.readline a = int(input()) data = list(map(int, input().split())) dp = [i for i in data] for i in range(a) : for j in ..

[다이나믹 프로그래밍] 이코테 (파이썬) 바닥 공사 풀이

[문제] 가로의 길이가 N, 세로의 길이가 2인 직사각형 형태의 얇은 바닥이 있다. 태일이는 이 얇은 바닥을 1 X 2의 덮개, 2 X 1의 덮개, 2 X 2의 덮개를 이용해 채우고자 한다. 이때 바닥을 채우는 모든 경우의 수를 구하는 프로그램을 작성하시오. 예를 들어 2 X 3 크기의 바닥을 채우는 경우의 수는 5가지이다. [입력 조건] 1. 첫째 줄에 N이 주어진다. (1

[다이나믹 프로그래밍] 이코테 (파이썬) 병사 배치하기 풀이

[문제] N명의 병사가 무작위로 나열되어 있습니다. 각 병사는 특정한 값의 전투력을 보유하고 있습니다. 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 합니다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 합니다. 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용합니다. 그러면서도 남아 있는 병사의 수가 최대가 되도록 하고 싶습니다. 예를 들어, N = 7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하겠습니다. 병사 번호 1 2 3 4 5 6 7 전투력 15 11 4 8 5 2 4 이때 3번 병사와 6번 병사를 열외시키면, 다음과 같이 남아 있는 병사의 수가 내림차순의 형태가 되며 5명이 됩니다. 이는 남아 있는 병..

[다이나믹 프로그래밍] 이코테 (파이썬) 금광 풀이

[문제] n x m 크기의 금광이 있습니다. 금광은 1 x 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있습니다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작합니다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있습니다. 이후에 m - 1번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 합니다. 결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하세요. [입력 조건] 1. 첫째 줄에 테스트 케이스 T가 입력됩니다. (1

[다이나믹 프로그래밍] 이코테 (파이썬) 효율적인 화폐 구성 풀이

[문제] N가지 종류의 화폐가 있습니다. 이 화폐들의 개수를 최소한으로 이용해서 그 가치의 합이 M원이 되도록 하려고 합니다. 이때 각 종류의 화폐는 몇 개라도 사용할 수 있습니다. 예를 들어 2원, 3원 단위의 화폐가 있을 때는 15원을 만들기 위해 3원을 5개 사용하는 것이 가장 최소한의 화폐 개수입니다. M원을 만들기 위한 최소한의 화폐 개수를 출력하는 프로그램을 작성하세요. [입력 조건] 1. 첫째 줄에 N, M이 주어진다. (1

[다이나믹 프로그래밍] 이코테 (파이썬) 1로 만들기 풀이

[문제] 정수 X가 주어졌을 때, 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지입니다. 1. X가 5로 나누어 떨어지면, 5로 나눕니다. 2. X가 3으로 나누어 떨어지면, 3으로 나눕니다. 3. X가 2로 나누어 떨어지면, 2로 나눕니다. 4. X에서 1을 뺍니다. 정수 X가 주어졌을 때, 연산 4개를 적절히 사용해서 값을 1로 만들고자 합니다. 연산을 사용하는 횟수의 최솟값을 출력하세요. 예를 들어 정수가 26이면 다음과 같이 계산해서 3번의 연산이 최솟값입니다. 26 -> 25 -> 5 -> 1 [입력 조건] 1. 첫째 줄에 정수 X가 주어집니다. (1

[다이나믹 프로그래밍] 이코테 (파이썬) 개미 전사 풀이

[문제] 개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 합니다. 메뚜기 마을에는 여러 개의 식량창고가 있는데 식량창고는 일직선으로 이어져 있습니다. 각 식량창고에는 정해진 수의 식량을 저장하고 있으며 개미 전사는 식량창고를 선택적으로 약탈하여 식량을 빼앗을 예정입니다. 이때 메뚜기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있습니다. 따라서 개미 전사가 정찰병에서 들키지 않고 식량창고를 약탈하기 위해서는 최소한 한 칸 이상 떨어진 식량창고를 약탈해야 합니다. 예를 들어 식량창고 4개가 다음과 같이 존재한다고 가정합시다. {1, 3, 1, 5} 이때 개미 전사는 두 번째 식량창고와 네 번째 식량창고를 선택했을 때 최댓값인..