백준 온라인 저지
백준 9465: 스티커
dev_doyle
2018. 7. 9. 14:41
다이나믹 프로그래밍을 이용하는 문제. 스티커를 뜯지 않았을 때, 위쪽을 뜯었을 때, 아래쪽을 뜯었을 때의 경우를 나누고 각 경우에 따라 이전의 스티커 상태와의 관계를 점화식으로 세운 후 코딩하면 된다. 마지막 출력에서 endl을 쓰지 않아서 답 찾느라고 고생했다.. 후
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 32 33 34 35 36 37 38 39 | #include <iostream> #include <algorithm> using namespace std; long long d[100100][3]; long long point[1000100][2]; int main() { int init_input = 0; cin >> init_input; //주어진 T케이스 만큼 값을 구한다. while (init_input--) { int line = 0; cin >> line; //point 배열에 주어진 값 넣기 for (int j = 0; j < 2; ++j) { for (int k = 1; k <= line; ++k) cin >> point[k][j]; } //d[i][0] 안뜯었을 때의 값 d[i][1] 아래 스티커 뜯었을 때의 값 d[i][2] 위 스티커 뜯었을 때의 값 d[0][0] = 0; d[0][1] = 0; d[0][2] = 0; for (int j = 1; j <= line; ++j) { d[j][0] = max(d[j - 1][0], max(d[j - 1][1], d[j - 1][2])); d[j][1] = max(d[j - 1][0], d[j - 1][2]) + point[j][0]; d[j][2] = max(d[j - 1][0], d[j - 1][1]) + point[j][1]; } long long ans = 0; for (int l = 1; l <= line; l++) { ans = max(max(ans, d[l][0]), max(d[l][1], d[l][2])); } cout << ans << endl; //출력을 잘보자.. } return 0; } | cs |