[BOJ] 2240번 : 자두나무

2024. 9. 20. 07:41Algorithm

1. problem : 

https://www.acmicpc.net/problem/2240

 

2. solution 1 :

#include <bits/stdc++.h>
using namespace std;
int t, w; 
int d[1005][32][3]; 
int cherry[1005];

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin >> t >> w; 
	for (int i = 1; i <= t; i++) cin >> cherry[i]; 

	for (int i = 1; i <= t; i++) {
		d[i][0][1] = d[i - 1][0][1] + (cherry[i] == 1 ? 1 : 0); 

		for (int j = 1; j <= w; j++) {
			if (cherry[i] == 1) {
				d[i][j][1] = max(d[i - 1][j - 1][2], d[i - 1][j][1]) + 1; 
				d[i][j][2] = max(d[i - 1][j][2], d[i - 1][j - 1][1]);
			}
			else {
				d[i][j][1] = max(d[i - 1][j - 1][2], d[i - 1][j][1]);
				d[i][j][2] = max(d[i - 1][j][2], d[i - 1][j - 1][1]) + 1;
			}
		}
	}
	int ans = 0; 
	for (int i = 0; i <= w; i++) {
		ans = max(ans, d[t][i][1]);
		ans = max(ans, d[t][i][2]);
	}
	cout << ans << '\n';
}

source code 출처 : https://github.com/encrypted-def/basic-algo-lecture/blob/master/workbook/0x10.md

 

basic-algo-lecture/workbook/0x10.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

dp를 이용해 풀어야 한다. 따라서, 세 가지 스텝으로 문제를 푼다. 

1. 테이블정의 

d [i][j][k] --> 시간이 i, 이동 횟수 j , 나무의 위치 k 일 때, 먹을 수 있는 자두의 최댓값으로 정의한다. 

 

2. 점화식 

first. 움직이지 않는 경우, 즉, 이동 횟수가 0이고, 1번 트리에만 있는 경우, 

d [i][0][1] = d [i-1][0][1] + (cherry [i] == 1? 1 : 0 ) 

 

second 움직이는 경우, 

second.1. 떨어지는 체리가 1번 트리인 경우, 

d [i][mv][1] = max(d [i-1][mv-1][2] , d [i-1][mv][1]) + 1; 

d [i][mv][2] = max(d [i-1][mv][2], d [i-1][mv-1][1]) --> 체리를 먹지 않고, 다른 트리로 이동 

 

second.2. 떨어지는 체리가 2번 트리인 경우, 

d [i][mv][1] = max(d [i-1][mv-1][2] , d [i-1][mv][1]) ; --> 체리를 먹지 않고, 다른 트리로 이동

d [i][mv][2] = max(d [i-1][mv][2], d [i-1][mv-1][1]) + 1; 

 

3. 초기값 설정 

초기값은 d [0][0~w][1~2]를 0으로 설정한다. 

'Algorithm' 카테고리의 다른 글

[BOJ] 11656번 : 접미사 배열  (1) 2024.09.21
[BOJ] 14002번 : 가장 긴 증가하는 부분 수열 4  (0) 2024.09.21
[BOJ] 13913번 : 숨바꼭질 4  (0) 2024.09.19
[BOJ] 6593번 : 상범 빌딩  (0) 2024.09.19
[BOJ] 2468번 : 안전 영역  (0) 2024.09.18