//2.1
// j번 이동 해서 i초에 1번 나무로 온 경우
d[j][0][i] = max(d[j][0][i-1]+(arr[i] == 1), d[j-1][1][i-1]+(arr[i]==1));
// 1. d[j][0][i-1]+(arr[i] == 1)
// 1초 전에 이동하지 않은 경우
// 즉 1초 전에 움직이지 않은 경우 + 자두가 1번 나무에서 떨어진다면 +1
// 2. d[j-1][1][i-1]+(arr[i]==1)
// 1초 전에 이동하여 1번 나무로 온경우
// 즉 이동하였기 때문에 2번 나무의 테이블에서 값을 가져온다 + 자두가 1번 나무에서 떨어진다면 +1
그리고 또 밑의 코드
// 2.2
// j번 이동하여 i초에 2번 나무에 온경우
d[j][1][i] = max(d[j][1][i-1]+(arr[i] == 2), d[j-1][0][i-1]+(arr[i] == 2));
// 1. d[j][1][i-1]+(arr[i] == 2)
// 1초전에 움직이지 않고 그대로 있던 경우 + 자두가 2번 나무에서 떨어진다면 +1
// 2. d[j-1][0][i-1]+(arr[i] == 2)
// 1초전에 1번 나무에서 2번나무로 옮겨온 경우 + 자두가 2번 나무에서 떨어진다면 +1
3. 결과
int ans = 0;
for(int i = 0; i < 2; ++i)
for(int j = 0; j <=w; ++j)
ans = max(ans, d[j][i][t]);
cout << ans;
이 문제에서 얻어 가야 할 것
1. 테이블의 각 차원에 의미를 담을 수 있다.
2. 사실 많이 풀어 보며 감을 잡는 게 얻는 것 아닐까?
문제를 풀며
답을 보면서 이해하는 것도 힘들었다... 답을 보고 있는데도 하기 싫었고 그만하고 싶었다.
그런데 이 문제를 넘지 않으면 난 그저 그런 상태로 남아 있을 거라고 생각하니, 갑자기 어떻게든 이해는 해야겠다는 오기가 생겼다.