본문 바로가기

728x90

동적계획법

[백준알고리즘] 11660번: 구간 합 구하기 -C++ [백준알고리즘] 11660번: 구간 합 구하기 -C++ 11660번: 구간 합 구하기 5 (acmicpc.net) 11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 오랜만에 DP 문제를 풀어봤다. 그래서 쉬운 난이도를 골랐는데, 너무 쉬운 걸 고른 것 같기도 하다. DP는 점화식만 잘 구하면 쉽게 문제를 풀 수 있다. 이 문제에서는 2개의 점화식을 구해야 한다. 잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다 문제 풀이 이번 문제는 행렬의 \((x1, y1)\)부터 .. 더보기
[백준알고리즘] 12865번: 평범한 배낭 -C++ [백준알고리즘] 12865번: 평범한 배낭 -C++ 12865번: 평범한 배낭 (acmicpc.net) 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net 대표적인 Knapsack 알고리즘의 문제다. 조합의 문제고, 동적계획법(DP; Dynamic Programming)을 사용하는 대표적인 문제다. 아래의 두 링크는 위키피디아인데 영어가 못 알아먹겠어도 내용이 많다. 잘 정리된 블로그들도 많으니 참고하면 좋을 듯하다. Knapsack problem .. 더보기
[백준알고리즘] 1912번: 연속합 -C++ [백준알고리즘] 1912번: 연속합 -C++ 1912번: 연속합 (acmicpc.net) 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 주어진 수열에서 연속된 부분 수열을 뽑아냈을 때 가장 연속합이 큰 값을 구하면 된다. 예전에 파이썬으로 많이 풀었던 문제다. 그래서 그런가 이번에도 뭔가 아이디어가 쉽게 떠올랐다. 많이 인상 깊게 푼 문제였나 보다. [백준알고리즘] 1912번: 연속합 -Python (tistory.com) [백준알고리즘] 1912번: 연속합 -Python [백준알고리즘] 1912번: 연속합 -Pyth.. 더보기
[백준알고리즘] 9251번: LCS -C++ [백준알고리즘] 9251번: LCS -C++ 9251번: LCS (acmicpc.net) 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 두 문자열이 주어졌을 때 구할 수 있는 최장의 공통 부분 수열을 구하는 문제다. 예전에 파이썬으로 풀었던 문제다. 그때 당시에 풀기 위해서 굉장히 시간을 많이 투자했던 것으로 기억한다. 그러다 보니 오늘 풀 때도 전보다는 굉장히 수월하게 풀었다. 물론 한 번에 푼 건 아니었고.. 예전과 같은 문제를 거치면서 통과했다. 그러면서 느.. 더보기
[백준알고리즘] 2565번: 전깃줄 -C++ [백준알고리즘] 2565번: 전깃줄 -C++ 2565번: 전깃줄 (acmicpc.net) 2565번: 전깃줄 첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 www.acmicpc.net 주어진 전깃줄 중에서 최소의 전깃줄을 제거해 겹치는 선이 없게 만드는 문제다. 예전에 파이썬으로 풀었던 적이 있는 문제다. 예전에 풀었던 코드를 보니 '역시 파이썬은 코드가 쉽구나'라는 생각과 동시에 '이때는 왜 이리 쉽게 푼 것 같지..'라는 생각이 들었다. 그만큼 오늘 바로 풀어내지는 못했었다. [백준알고리즘] 2565번: 전깃줄 -Python (tistory.com) [백준알.. 더보기
[백준알고리즘] 11054번: 가장 긴 바이토닉 부분 수열 -C++ [백준알고리즘] 11054번: 가장 긴 바이토닉 부분 수열 -C++ 11054번: 가장 긴 바이토닉 부분 수열 (acmicpc.net) 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net 괜히 고민을 많이 했는데 결국에는 가장 직관적으로 문제를 풀었다. 계산을 대충 해도 두 번의 이중 for문을 돌렸을 때 \( 1000 \times 1000 \times 2 = 2 \times 10^{6} = 2000000 \)의 연산이 필요하다. 즉, 1억 번에 한참 못 미치는 연산을 수행해도 가능하다. 예전에 파이썬으로 풀었던 문제다. 아래에 글 .. 더보기
[백준알고리즘] 11053번: 가장 긴 증가하는 부분 수열 -C++ [백준알고리즘] 11053번: 가장 긴 증가하는 부분 수열 -C++ 11053번: 가장 긴 증가하는 부분 수열 (acmicpc.net) 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 말 그대로 주어진 수열 중에서 원소의 순서를 변경하지 않고 증가하는 수열을 만들 때 만들 수 있는 가장 긴 수열의 길이를 구하는 문제다. 예전에 파이썬으로 푼 적이 있던 문제다. 이때 코드를 보니까 훨씬 쉽게 풀었던 것을 알 수 있다. C++로도 이 방.. 더보기
[백준알고리즘] 1890번: 점프 -C++ [백준알고리즘] 1890번: 점프 -C++ 1890번: 점프 (acmicpc.net) 1890번: 점프 첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 www.acmicpc.net 누가 봐도 동적 계획법으로 풀어야 할 것 같은 문제다. 그래서 가능한 모든 경우를 찾는데 재귀를 사용했고, DFS를 사용했다. 사실 이전에 Python으로 풀었던 문제였다. 물론 기억은 나질 않았지만.. 아래 링크가 이전에 풀었던 코드다. [백준알고리즘] 1890번: 점프 -Python (tistory.com) [백준알고리즘] 1890번: 점프 -Python [백준알.. 더보기

728x90