본문 바로가기

memoization

(12)
[C/C++] 백준 14501 퇴사 14501 퇴사 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 마지막 날부터 거꾸로 생각하면 풀기 쉬워진다. DP[i]: n 번째 날부터 i 번째 날까지 일했을 때 얻는 최대 이익. DP[i]는 두 가지 경우로 나눌 수 있는데, i 번째 날에 잡힌 상담을 하는 경우와 그렇지 않은 경우이다. i 번째 날에 잡힌 상담을 하지 않는 경우: DP[i] = DP[i + 1]과 같다 할 수 있다. i 번째 날에 잡힌 상담을 하는 경우: DP[i] = DP[ i + (i 번째 날에 잡힌 상담 일수)] + (i 번째 날에 잡힌 상담의 금액) 이때 i + (i 번째 잡힌 상담 일수)가 n+1을 넘으면 일을 할 수 없으므로 예외 처리를 해준다. C #include..
[C/C++] 백준 12865 평범한 배낭 12865 평범한 배낭 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net C #include #define MAX(a, b) (((a) > (b)) ? (a) : (b)) int DP[103][100003]; int w[103]; int v[103]; int main() { int n, k; scanf("%d %d", &n, &k); for (int i = 1; i n >> k; for (int i = 1; i > w[i] >> v[i]; for ..
[C++] 백준 2482 색상환 2482 색상환 2482번: 색상환 첫째 줄에 N색상환에서 어떤 인접한 두 색도 동시에 선택하지 않고 K개의 색을 고를 수 있는 경우의 수를 1,000,000,003 (10억 3) 으로 나눈 나머지를 출력한다. www.acmicpc.net C++ #include #include #include using namespace std; #define MOD 1000000003 int DP[1003][1003]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; for (int i = 0; i
[C++] 백준 11054 가장 긴 바이토닉 부분 수열 11054 가장 긴 바이토닉 부분 수열 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net C++ #include #include #include using namespace std; vector per; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, input; cin >> n; vector memo(n); // 거기까지의 최대 길이 vector memo2(n); // 거기서부터의 최대 길이 for (int i = 0; i > input; per...
[C++] 백준 1937 욕심쟁이 판다 1937 욕심쟁이 판다 1937번: 욕심쟁이 판다 n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 www.acmicpc.net C++ #include #include using namespace std; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; int n; int DAE[503][503]; // 대나무 숲의 정보 int DP[503][503]; // Dynamic Programming int DPP(int x, int y) { if (DP[x][y]) return DP[x][y]; DP[x][y] =..
[C++] 백준 11066 파일 합치기 11066 파일 합치기 11066번: 파일 합치기 문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 �� www.acmicpc.net C++ #include #include #include #define INF 987654321 using namespace std; typedef long long ll; int w[503]; int sum[503]; int DP[503][503]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) { int k; cin >> k;..
[C++] 백준 1699 제곱수의 합 1699 제곱수의 합 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net C++ #include #include #include using namespace std; typedef long long ll; int DP[100003] = {0, }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int t=1; t
[C++] 백준 1149 RGB거리 1149 RGB거리 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net C++ #include #include using namespace std; int DP[1003][3] = {0,}; int RGB[1003][3] = {0,}; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for (int i = 1; i > RGB[i][j]; for (int i = 1; i
[C++] 백준 11049 행렬 곱셈 순서 11049 행렬 곱셈 순서 11049번: 행렬 곱셈 순서 첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같� www.acmicpc.net DP[i][j]를 구간 [i, j]에서의 최소 행렬 곱셈 회수라 하면, DP[i][j] = k가 i부터 j까지 이동할 때 (DP[i][k] + DP[k+1][j] + row[i]*col[k]*col[j])의 최솟값이라 나타낼 수 있다. i ~ j까지의 거리 (볼 행렬의 개수)를 먼저 고정하고, k를 움직여가며 i, j 각각에 대한 DP[i][j] 값을 구하는 방식으로 풀었다. C++ #include #include #inc..
[C++] 백준 11053 가장 긴 증가하는 부분 순열 11053 가장 긴 증가하는 부분 순열 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net C++ #include #include using namespace std; vector per; int main() { int n, input; cin >> n; vector memo(n); // 거기까지의 최대 길이 for (int i = 0; i > input; per.push_back(input); // 들어가..
[C] 백준 2748 피보나치 수 2 2748 피보나치 수 2 2748번: 피보나치 수 2 문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)�� www.acmicpc.net C #include int main(){ int n; scanf("%d", &n); long long arr[91] = {0, 1}; for (int i = 2; i
[C++] 백준 11726 2×n 타일링 11726 2×n 타일링 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net C++ #include #include using namespace std; vector DP(1003); int main(){ ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; DP[1] = 1; DP[2] = 2; for(int i= 3; i