Study hard
(c++)백준 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 |