반응형
문제링크: www.acmicpc.net/problem/2616
2616번: 소형기관차
첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있
www.acmicpc.net
down-up방식 점화식을 구하지 못해 up-down 방식을 사용했습니다.
한점 기준으로 해당 위치부터 소형 기관차를 사용하는 경우 혹은 사용하지 않는 경우 두가지를 비교해주며 결과값을 도출했습니다.
dp[i][j]는 i번째 위치에서부터 j개의 소형기관차를 사용할때 얻을 수 있는 최대값을 가르킵니다. 이때 점화식은
- max(solved(current + 1, cnt), solved(current + k, cnt + 1) + (arr[current + k - 1] - arr[current - 1]));
아래는 정답코드입니다.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n = 0, k = 0;
int dp[50001][3] = { 0, };
int arr[50001] = { 0, };
int solved(int current, int cnt) {
if (current > n || cnt == 3)
return 0;
int &ret = dp[current][cnt];
if (ret != -1)
return ret;
if ((current + k - 1) <= n)
ret = max(solved(current + 1, cnt), solved(current + k, cnt + 1) + (arr[current + k - 1] - arr[current - 1]));
return ret;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
int temp = 0;
cin >> temp;
arr[i] = arr[i - 1] + temp;
}
cin >> k;
memset(dp, -1, sizeof(dp));
cout << solved(1, 0) << endl;
/*
for (int i = 1; i <= n; i++)
cout << arr[i] << endl;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 3; j++)
cout << dp[i][j] << ' ';
cout << endl;
}*/
return 0;
}
down-up방식도 가능할거 같아 찾아봤습니다.
lyzqm.blogspot.com/2017/03/2616.html
2616 소형기관차
백준 2616 소형기관차 https://www.acmicpc.net/problem/2616 소형기관차 3대를 이용하여 최대로 운송할 수 있는 손님 수를 구하는 문제이다. $DP[N][M]$ : 소형기관차를 N대 운행할 때 M번째 객차를 선택했...
lyzqm.blogspot.com
DP[N][M]=max(DP[N][M−1],DP[N−1][M−K]+S[M]−S[M−K] 해당 점화식 사용하셔서 푸는 답도 있습니다.
반응형
'알고리즘 > DP' 카테고리의 다른 글
[백준] 2533-사회망 서비스(SNS)(C++) (0) | 2020.12.23 |
---|---|
[백준] 18427-함께 블록 쌓기(C++), 배낭알고리즘 (0) | 2020.12.23 |
[백준] 17208-카우버거 알바생(C++), 배낭 문제 알고리즘 (0) | 2020.12.17 |
[백준] 7579-앱(C++), 배낭 문제 알고리즘 (0) | 2020.12.17 |
[백준] 12865-평범한 배낭(C++), 배낭 문제 알고리즘 (0) | 2020.12.17 |