티스토리 뷰
문제 출처: https://www.acmicpc.net/problem/2240
2240번: 자두나무
자두는 자두를 좋아한다. 그래서 집에 자두나무를 심어두고, 여기서 열리는 자두를 먹고는 한다. 하지만 자두는 키가 작아서 자두를 따먹지는 못하고, 자두가 떨어질 때까지 기다린 다음에 떨어
www.acmicpc.net
zadoo(현재 시간, 남은 움직임 횟수, 현재 위치)를 선언하여 Top-down방식으로 작성하였다.
함수가 호출되면
1. 가만히 있는다.
- 현재 위치에 자두가 떨어진다면 +1을 한다.
- 현재 위치에 자두가 떨어지지 않는다면 +0을한다.
2. 움직일수 있다면 움직여본다. (남은 움직임 횟수 -1)
- 현재 위치에 자두가 떨어진다면 +0을 한다.(움직인 곳에는 없기 때문에)
- 현재 위치에 자두가 떨어지지 않는다면 +1을 한다.(움직인 곳에 떨어지기 때문에)
각 조건에 대해 재귀적으로 호출한 뒤 최대값을 dp[현재시간][남은움직임횟수][현재위치]에 저장해두어 메모이제이션을 한다.
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include <string>
using namespace std;
int T, W;
int arr[1001];
int dp[1001][31][2];
int zadoo(int idx, int move,int tree) {
if (idx == T)return 0;
if (dp[idx][move][tree] != -1)return dp[idx][move][tree];
int val;
if (arr[idx] == tree) val = zadoo(idx + 1, move, tree) + 1;
else val = zadoo(idx + 1, move, tree);
if (move > 0) {
int nexttree = (tree == 1) ? 2 : 1;
if (arr[idx] == tree) val = max(val, zadoo(idx + 1, move - 1, nexttree));
else val = max(val, zadoo(idx + 1, move - 1, nexttree) + 1);
}
dp[idx][move][tree] = val;
return val;
}
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> T >> W;
for (int i = 0; i < T; i++)cin >> arr[i];
fill(&dp[0][0][0], &dp[1000][30][2], -1);
cout << zadoo(0, W, 1);
}'PS' 카테고리의 다른 글
| [백준] 2293번 동전 1 C++ (0) | 2022.06.29 |
|---|---|
| [백준] 2302번 극장 좌석 C++ (0) | 2022.06.29 |
| [백준] 15486번 퇴사 2 C++ (0) | 2022.06.28 |
| [백준] 15988번 1, 2, 3 더하기 3 C++ (0) | 2022.06.27 |
| [백준] 11055번 가장 큰 증가 부분 수열 (0) | 2022.06.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 6018
- 스택
- 골목길
- 1004
- 6539
- 타임머신
- 11657
- 7511
- 상범빌딩
- 1918
- 골목길C++
- 백준
- 소셜네트워킹어플리케이션
- 벨만포드
- 1738
- 어린왕자 C++
- C++
- 후위 표기식
- 벨만-포드
- tea time
- 중위 표기식 후위 표기식으로 변환
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
