다이나믹 프로그래밍 63

백준 5557번 1학년 C++

https://www.acmicpc.net/problem/5557 5557번: 1학년 상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀 www.acmicpc.net 2차원 dp 배열을 만든다. dp[i][j]는 i번째까지의 식의 결과가 j인 경우의 수이다. 처음에는 결과가 v[0] 하나만 존재하기 때문에 dp[0][v[0]] = 1로 초기값을 정해준다. i가 늘어날때마다 j를 0~20을 검사하면서 dp[i-1][j]가 0이 아니라면 i-1번째까지의 값이 j인 경우가 존재한다는 뜻이다. 여기서 j+v[i], j-v[i]를 계산해 0~20사이라면 전 결과..

알고리즘 2023.04.20

백준 18353번 병사 배치하기 C++

https://www.acmicpc.net/problem/18353 18353번: 병사 배치하기 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 가장 긴 증가하는 부분 수열 응용문제 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using int64 = long long; int n;..

알고리즘 2023.03.22

백준 1965번 상자넣기 C++

https://www.acmicpc.net/problem/1965 1965번: 상자넣기 정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 www.acmicpc.net 다이나믹 프로그래밍, 가장 긴 증가하는 부분 수열을 구하면 되는 문제이다. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using int64 = long lo..

알고리즘 2023.03.21

백준 4095번 최대 정사각형 C++

https://www.acmicpc.net/problem/4095 4095번: 최대 정사각형 입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 N과 M이 주어진다. (1 ≤ N,M ≤ 1,000) 다음 N개의 줄에는 공백으로 구분된 M개의 수가 주어진다. 마지막 줄에는 0이 두 www.acmicpc.net 현재 좌표가 1일때 왼쪽 위, 왼쪽, 위쪽 에서 가능한 정사각형 중 가장 작은 정사각형 + 1을 하면 현재 좌표에서 만들 수 있는 가장 큰 정사각형이다. #include #include #include #include #include #include #include #include #include #include #include #include #include #include..

알고리즘 2023.03.17

백준 4097번 수익 C++

https://www.acmicpc.net/problem/4097 4097번: 수익 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 N이 주어져 있다. (1 ≤ N ≤ 250,000) 둘째 줄부터 N개의 줄에는 매일 매일의 수익 P가 주어진다. (-10,000 ≤ P ≤ 10 www.acmicpc.net 전날 + 지금 수익이 지금 수익보다 크면 지금까지의 최대 수익을 갱신한다. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; u..

알고리즘 2023.02.13

백준 14494번 다이나믹이 뭐에요? C++

https://www.acmicpc.net/problem/14494 14494번: 다이나믹이 뭐예요? (1, 1)에서 (n, m)에 도달하는 경우의 수를 구하여라. 단, 경우의 수가 엄청 커질 수 있으므로 경우의 수를 1,000,000,007(=109+7)로 나눈 나머지를 출력한다. www.acmicpc.net dp #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using int64 = long long; const int divVal = 1000000007;..

알고리즘 2023.02.05

백준 13703번 물벼룩의 생존확률 C++

https://www.acmicpc.net/problem/13703 13703번: 물벼룩의 생존확률 수면에서 k 센티미터 아래에 있는 물벼룩은 1초마다 각각 1/2의 확률로 위 또는 아래로 1 센티미터 이동한다. 물벼룩은 수면에 닿자마자 기다리고 있던 물매암이들에 의해 먹혀 없어진다. 예를 www.acmicpc.net 다이나믹 프로그래밍 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using int64 = long long; int k, n; vector c..

알고리즘 2023.02.02

백준 16957번 체스판 위의 공 C++

https://www.acmicpc.net/problem/16957 16957번: 체스판 위의 공 크기가 R×C인 체스판이 있고, 체스판의 각 칸에는 정수가 하나씩 적혀있다. 체스판에 적혀있는 정수는 모두 서로 다르다. 체스판의 각 칸 위에 공을 하나씩 놓는다. 이제 공은 다음과 같은 규칙 www.acmicpc.net 이미 지나간 길은 따로 저장해서 불필요한 계산은 줄이는 메모이제이션 기법을 활용하여 문제를 해결하였다. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace s..

알고리즘 2022.12.29

백준 15990번 1, 2, 3 더하기 5 C++

https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 다이나믹 프로그래밍 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using int64 = long long; const int64 mod = 1000000009; vector cache; int64 d..

알고리즘 2022.11.19

백준 12869번 뮤탈리스크 C++

https://www.acmicpc.net/problem/12869 12869번: 뮤탈리스크 1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다. www.acmicpc.net dp #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using int64 = long long; int n; vector v; vector cache; int ..

알고리즘 2022.10.22