[백준 / BOJ] 1309 동물원 C++
·
알고리즘/DP
문제 설명DP 문제입니다.어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다.이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다. 제한 사항풀이즉, DP[i] = DP[n-1]*2 + DP[n-2] 라는 식이 도출됩니다.전체 코드 #include using namespace std;const int MAX = 100001;int N;int DP[MAX]..
[백준 / BOJ] 1149 RGB거리 C++
·
알고리즘/DP
문제 설명DP 문제입니다.RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.1번 집의 색은 2번 집의 색과 같지 않아야 한다.N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.제한 사항풀이전체 코드#include #include using namespace std;const int MAX = 1001;int N, minCost = 987654321;int DP[MAX][3] =..
[백준 / BOJ] 11052 카드 구매하기 C++
·
알고리즘/DP
문제 설명DP 문제입니다.요즘 민규네 동네에서는 스타트링크에서 만든 PS카드를 모으는 것이 유행이다.PS카드는 PS(Problem Solving)분야에서 유명한 사람들의 아이디와 얼굴이 적혀있는 카드이다. 각각의 카드에는 등급을 나타내는 색이 칠해져 있고, 다음과 같이 8가지가 있다. 전설카드레드카드오렌지카드퍼플카드블루카드청록카드그린카드그레이카드 카드는 카드팩의 형태로만 구매할 수 있고, 카드팩의 종류는 카드 1개가 포함된 카드팩, 카드 2개가 포함된 카드팩, ... 카드 N개가 포함된 카드팩과 같이 총 N가지가 존재한다.민규는 카드의 개수가 적은 팩이더라도 가격이 비싸면 높은 등급의 카드가 많이 들어있을 것이라는 미신을 믿고 있다. 따라서, 민규는 돈을 최대한 많이 지불해서 카드 N개 구매하려고 한다...
[백준 / BOJ] 2294 동전 2 C++
·
알고리즘/DP
문제 설명DP 문제입니다.n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.제한 사항풀이따라서 DP[j] = min(DP[j], DP[j - Coin[i]] + 1) 라는 식이 도출된다.전체 코드#include #include #define INF 987654321using namespace std;int N, K;int DP[10001] = {0, };int Coin[101] = {0, };int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N >> K; /* 동전 ..
[백준 / BOJ] 1912 연속합 C++
·
알고리즘/DP
문제 설명DP 문제입니다.n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.제한 사항풀이전체 코드#include "test.h"#include #include #include using namespace std;int N;int DP[100001] = {0, };int Numbers[100001] = {0, };int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.t..
[백준 / BOJ] 11053 가장 긴 증가하는 부분 수열 C++
·
알고리즘/DP
문제 설명DP 문제입니다.수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.제한 사항풀이전체 코드#include #include using namespace std;int N;int DP[1001] = {0, };int Numbers[1001] = {0, };int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N; for(int i=1; i> Numbers[i]; } for(int i=..
[백준 / BOJ] 1890 점프 C++
·
알고리즘/DP
문제 설명DP 문제입니다.N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다.각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로 점프를 하는 두 경우만 존재한다.가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 이동할 수 있는 경로의 개수를 구하는 프로그램을 작성하시오.제한 사항풀이이런 느낌으로 푸는 것이라고 생각해서DP배열과 Graph배열 두개를 만들어..
[백준 / BOJ] 11048 이동하기 C++
·
알고리즘/DP
문제 설명DP 문제입니다.준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다.준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으로 나갈 수는 없다.준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구하시오.제한 사항풀이처음 이 문제를 접했을때에는 응? 왜 DP 문제집에 BFS가 있지? 라고 생각했지만, BFS의 경우, 같은 조건에서의..
[백준 / BOJ] 10844 쉬운 계단 수 C++
·
알고리즘/DP
문제 설명DP 문제입니다.45656이란 수를 보자.이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.제한 사항풀이전체 코드#include using namespace std;int N;long long DP[101][11];int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N; DP[1][0] = 0; for(int i=1; i
[백준 / BOJ] 11057 오르막 수 C++
·
알고리즘/DP
문제 설명DP 문제입니다.오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.제한 사항풀이전체 코드#include using namespace std;int N;int DP[1001][10];int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N; for(int i=0; i