[BOJ-Code] 15486 - 퇴사 2

Posted by DHniyeo Blog on March 10, 2024

문제 링크

💡 다이나믹 프로그래밍

Memory 18688KB Time 312ms Code Length 525B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
#include<algorithm>

using namespace std;
struct INFO {
	int t;
	int p;
};
INFO arr[1500001];
int memo[1500001];
int dp(int n) {
	memo[1] = 0;
	int ans = 0;
	for (int i = 1; i <= n+1; i++) {
		// 현재까지의 최대값
		ans = max(ans, memo[i]);
		if (i + arr[i].t > n + 1)continue;
		memo[i + arr[i].t] = max(memo[i + arr[i].t],ans + arr[i].p);
	}
	return ans;
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf(" %d %d", &arr[i].t, &arr[i].p);

	}
	printf("%d", dp(n));
}

이 코드는 n일 동안의 일을 효율적으로 처리하여 얻을 수 있는 최대 이익을 계산하는 프로그램이다. 구조체 INFO는 각 일의 소요 시간과 보상을 나타내며, arr 배열에 저장된다. dp 함수는 동적 계획법을 사용하여 최대 이익을 계산하는 함수이다. memo 배열은 각 날짜별 최대 이익을 저장하는 배열이다.

main 함수에서는 사용자로부터 n일을 입력받고, 각 일의 소요 시간과 보상을 arr 배열에 저장한다. 그 후 dp 함수를 호출하여 최대 이익을 계산하고 출력한다.