🖇️ 문제 링크
💡 문제 분석
전 날에 먹은 디저트가 무엇인가에 따라 다음날 만족도가 바뀌기 때문에, 전날 먹은 디저트를 함께 메모이제이션합니다.
각 날마다 어떤 디저트를 먹어야 최대의 만족도를 얻을 수 있는지 비교 후 결정합니다.
⌨️ 코드
import java.io.*;
import java.util.*;
public class Q17953 {
static int N, M;
static int[][] dessert, cache;
static int stoi(String s) { return Integer.parseInt(s); }
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = stoi(st.nextToken());
M = stoi(st.nextToken());
dessert = new int[M][N];
cache = new int[M][N];
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
Arrays.fill(cache[i], -1);
for (int j = 0; j < N; j++)
dessert[i][j] = stoi(st.nextToken());
}
System.out.println(dp(0, 0));
}
static int dp(int day, int prev) {
if(day == N) return 0;
int ret = cache[prev][day];
if(ret != -1) return ret;
ret = 0;
for(int i = 0; i < M; i++) {
if(day != 0 && i == prev)
ret = Math.max(ret ,dp(day + 1, i) + dessert[i][day] / 2);
else
ret = Math.max(ret ,dp(day + 1, i) + dessert[i][day]);
}
return cache[prev][day] = ret;
}
}
⏱️ 결과