Study hard

(c++)백준 2616번: 소형기관차 본문

백준/DP

(c++)백준 2616번: 소형기관차

Nimgnoej 2020. 9. 20. 21:48

www.acmicpc.net/problem/2616

 

2616번: 소형기관차

첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있�

www.acmicpc.net

[풀이]

DP로 풀 수 있는 문제였다.

DP[x][y]: x번째 소형 기관차가 y번째 객차를 끌고갈 경우

x번째 기관차가 y번째 객차를 끌고가는 경우와 끌고가지 않는 경우를 비교해 줘야 한다.

train[]에 해당 인덱스까지의 누적 인원수를 저장한다.

res = max(solution(x,y+1), train[y + M - 1] - train[y - 1] + solution(x+1,y+M))

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int N, M;
int train[50001];
int DP[3][50001];

int solution(int x, int y) {
	if (x == 3 || y >= N)
		return 0;
	
	int& res = DP[x][y];
	if (res != -1)
		return res;
	res = 0;
	if (y + M - 1 <= N)
		res = max(solution(x, y + 1), train[y + M - 1] - train[y - 1] + solution(x + 1, y + M));
	
	return res;
}

int main() {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		int tmp;
		cin >> tmp;
		train[i] = train[i - 1] + tmp;
	}
	cin >> M;
	memset(DP, -1, sizeof(DP));
	cout << solution(0, 1) <<'\n';
	return 0;
}

'백준 > DP' 카테고리의 다른 글

(c++)백준 15591번: MooTube (Silver)  (0) 2020.09.23
(c++)백준 2163번: 초콜릿 자르기  (0) 2020.09.22
(c++)백준 2281번: 데스노트  (0) 2020.09.19
(c++)백준 12996번: Acka  (0) 2020.09.19
(c++)백준 12026번: BOJ거리  (0) 2020.09.18