본문 바로가기

DP10

[14501] 퇴사 https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net Dynamic Programming 문제이다. 사실 잘 몰라서 구글의 힘을 빌렸다. 오랫동안 안하다보니 머리가 굳은 것 같다ㅠㅠ A[i]를 i일에 받는 최대의 금액이라고 정의한다. 또한 받는 돈은 업무가 끝난 후 다음날에 들어온다고 가정한다. 1) i번째 날에 일한 경우 퇴사날을 넘기면 안되므로 조건문을 만든다. i+T[i]> N; for (int i = 1; i > T[i] >> P[i]; } // 그 다음날에 돈이 들어온다고 가정 for (int i = 1; i 2023. 4. 5.
[11660] 구간 합 구하기 5 https://www.acmicpc.net/problem/11660 11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 누적합 + 동적 프로그래밍 문제이다. 처음에 푼 것과 다시 푼 것 모두 설명해보려 한다. 1. 행 누적합 행과 열을 합쳐서 누적합을 구하기 어렵다고 판단하여 행의 누적합을 2차원 배열에 담았다. A[i][j]를 i행에서의 1~j열까지의 합으로 정의하였다. 예를 들어 A[1][3] = 1 + 2 + 3 = A[1][2] + 3 = 6 A[4][2] = 4 .. 2023. 1. 9.
[10844] 쉬운 계단 수 https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net DP 문제인데 한참을 헤매다가 다른 사람의 풀이를 참고하였다. 직접 써내려가면서 규칙을 찾아보려 했으나 N=4까지만 보고 규칙을 정한 탓에 틀려버렸다. for (int i = 3; i > N; /* 초기값 설정 */ for (int i = 0; i 2023. 1. 4.
[11053] 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net DP문제이다. for문 하나로 어떻게 풀지? 끙끙대다가 포기하고 LIS 알고리즘에 대해 검색해보았다. 최장 증가 부분 수열(LIS, Longest Increasing Subsequence) : 일부 원소를 골라내어 만든 부분 수열 중, 각 원소가 전 원소보다 크고(증가), 그 길이가 최대인 부분 수열 크게 O(n^2)로.. 2023. 1. 3.
[1912] 연속합 https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net DP 문제이다. 시간 제한이 1초라서 이중 for문은 안되겠구나.. 생각했다. 근데 처음에 이중 for문으로 풀었다.. 2시간 삽질의 서막 누적합을 배운지 얼마 안돼서 누적합을 이용하여 문제를 풀려고 했다. #include #include #include using namespace std; int N; int A[100001]; // A[i] = 1~i까지 더한 값 int R[100001]; int mai.. 2022. 11. 18.
[2156] 포도주 시식 https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 이 문제는 2579번 계단 오르기 문제와 굉장히 흡사하다. https://kmyobin.tistory.com/81 [2579] 계단 오르기 https://www.acmicpc.net/problem/2579 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점" data-og-host="www.acmicpc.net" data-og-source-url="https:.. 2022. 10. 31.
[2579] 계단 오르기 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net DP 문제인데 어려워서 검색함 ㅎㅎ 내 무궁한 발전을 위해 어쩔 수 없는 선택이었당~! 여기서 조건 3가지가 쓰여있다. 1. 계단은 한 번에 1, 2칸씩 2. 시작점 제외하고 연속해서 3계단 밟지 마라 3. 마지막 도착 계단은 밟아라 마지막 계단에 도착한다고 했을 때 2가지 경우가 존재한다. 1. 바로 전 계단을 밟고 마지막 계단 도착 -> 이 경우에는 전전계단을 밟으면 안된다(2번 조건 때문). 그러므로 전.. 2022. 10. 31.
[9461] 파도반 수열 https://www.acmicpc.net/problem/9461 9461번: 파도반 수열 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 www.acmicpc.net 지독하게 실버만 패는 사람,, 이 문제는 DP + 수학이 섞여 있는 문제이다. 나선형으로 돌아가는 형식이라 규칙이 있을 것이라 생각하고 직접 그려보며 문제를 풀었다. P(9)부터 규칙이 존재함을 발견했다. A[i] = A[i - 1] + A[i - 5]; 바로 그 전 값(i-1)과, 5번째 전에 있던 값(i-5)의 합이 현재 i의 값임을 알아냈다. 근데 그냥 했더니 틀렸다. 알고보니 int형이라 ove.. 2022. 10. 30.
[1904] 01타일 처음에는 00타일과 1타일로 만들 수 있는 경우의 수를 백트래킹을 이용하여 풀어보았다. #include #include using namespace std; int N; string m[1000001]; int cnt; void dp(int count, string before, bool is_done) { if (count == N) { cnt++; return; } if (before == "0" && is_done == false) { // 0이 하나만 쓰였을 때 m[count] = "0"; is_done = true; dp(count + 1, m[count], is_done); } else { // 0이 다 쓰여져있거나 그 전 값이 1이었던 경우 if (count == N - 1) { // 맨 마.. 2022. 9. 25.
[9184] 신나는 함수 실행 내가 스스로 짜긴 했는데 완전 야매 느낌이라 다른 사람들의 풀이를 보고 고쳤다. ㅜㅜ 재귀 함수를 쓰면 시간 초과가 뜨겠지! 라는 생각에 사로잡혀 그냥 for문을 3번 돌렸다 결론적으로 맞았는데, 예제가 없었다면 틀렸을 것이다. 아주아주 부끄러운 풀이다. #include #include using namespace std; int a, b, c, aa, bb, cc; int w[101][101][101]; int change(int x) { // x가 음수 : 1~50 index에 저장 // x가 양수 : 51~100 index에 저장 if (x 0) { return x + 50; } } void f() { for (int i = 0; i.. 2022. 9. 23.