Problem Solving/BOJ(백준)

[BOJ]백준 22114번: 창영이와 점프(C++)/DP

이진2 2021. 8. 8. 13:56

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

 

22114번: 창영이와 점프

창영이는 버스에서 내린 뒤 회사로 걸어가고 있다. 창영이가 걸어가는 길은 대부분 회색 보도블럭으로 포장되어 있는데, 가끔씩 빨간 보도블럭이 놓여있을 때가 있다. 창영이는 어린 시절 빨간

www.acmicpc.net

오랜만에 푸는 DP문제 

처음에 bottom-up으로 풀려고 했는데 점화식이 계속 생각이 안 나서 재귀로 푼 다음에 메모이제이션 적용했다

dp도 재귀(top-down)이기 때문에 base case, inductive step, memoization 이 세 가지 위주로 설계해야 할 듯 

#include <cstdio>
#include <algorithm>
using namespace std;

int n, k, l[100005], dp[2][100005],ans;

int func(bool b, int cur) {
	if (cur == n)return 1;

	int& ret = dp[b][cur];
	if (ret != -1)return ret;

	ret = 1;

	if (l[cur] <= k)
		ret = func(b, cur + 1) + 1;
	else if (!b)
		ret = max(func(true, cur + 1) + 1, ret);

	return ret;
}

int main() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i++)
		scanf("%d", &l[i]);

	fill(&dp[0][0], &dp[1][100001], -1);
	dp[0][n] = dp[1][n] = 1;

	for (int i = 1; i <= n; i++)
		ans = max(ans, func(false, i));

	printf("%d", ans);
	return 0;
}