[Boj2240] 자두나무

2024. 11. 20. 17:27·알고리즘

첫 번째 시도 (성공)

DP 테이블 정의

dp[t][w][k] = i 초일때 k번 나무에서 현재까지 w만큼 움직여서 얻을 수 있는 최대 자두의 수

 

DP 테이블 초기화 

// 1초에 자두가 떨어지는 나무의 위치에 따라 초기화
if(tree[0] == 1) {
	dp[0][0][0] = 1; 
}else{
    dp[0][1][1] = 1; 
}

// 주어진 시간동안 움직이지 않고 계속 제자리에 서 있는 경우
for(int t=1; t<T; t++) {
    dp[t][0][0] = (tree[t] == 1) ? dp[t-1][0][0] + 1 : dp[t-1][0][0];
}

 

점화식 

1초 전과 위치와 비교해서 움직이는 경우(dp[t-1][w-1][(i+1) % 2])와 현재 자리를 지키는 경우(dp[t-1][w][i]) 얻을 수 있는 자두의 최대 개수 + 현재 위치에 떨어지는 자두(cur) 값으로 갱신

dp[t][w][i] = Math.max(dp[t-1][w-1][(i+1) % 2], dp[t-1][w][i]) + cur;

 

전체 코드

import java.io.*;
import java.util.*; 

public class Main {
	
	static int T, W, tree[]; 
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		StringTokenizer st = new StringTokenizer(br.readLine()); 
		
		T = Integer.parseInt(st.nextToken());
		W = Integer.parseInt(st.nextToken()); // 최대 움직일 수 있는 
		
		tree = new int[T];
		
		for(int i=0; i<T; i++) {
			tree[i] = Integer.parseInt(br.readLine()); 
		}
		
		int[][][] dp = new int[T][W+1][2];
		
		for(int t=0; t<T; t++) {
			for(int w=0; w<=W; w++) {
				Arrays.fill(dp[t][w], 0);
			}
		}
		
		// 초기화
		dp[0][0][0] = (tree[0] == 1) ? 1 : 0;
		if(tree[0] == 2) {
			dp[0][1][1] = 1; 
		}
		
		for(int t=1; t<T; t++) {
			dp[t][0][0] = (tree[t] == 1) ? dp[t-1][0][0] + 1 : dp[t-1][0][0];
		}
		
		for(int t=1; t<T; t++) {
			for(int w=1; w<=W; w++) {
				
				for(int i=0; i<2; i++) {
					int cur = (tree[t] == i+1) ? 1 : 0; 
					
					dp[t][w][i] = Math.max(dp[t-1][w-1][(i+1) % 2], dp[t-1][w][i]) + cur;
					
				}
			}
		}
		
		int answer = 0; 
		for(int w=0; w<=W; w++) {
			for(int i=0; i<2; i++) {
				answer = Math.max(answer, dp[T-1][w][i]);
			}
		}
		
		System.out.println(answer);
	}

}

저작자표시 비영리 변경금지

'알고리즘' 카테고리의 다른 글

[알고리즘 이론] 벨만-포드 알고리즘  (0) 2025.04.30
[Boj16926] 배열 돌리기 1  (0) 2024.11.17
[BOJ1068] 트리  (1) 2024.11.16
[코드트리 조별과제] 부분 수열의 합이 K (누적합)  (1) 2024.08.20
[코드트리 조별과제] 두 수의 합 (HashMap)  (0) 2024.08.18
'알고리즘' 카테고리의 다른 글
  • [알고리즘 이론] 벨만-포드 알고리즘
  • [Boj16926] 배열 돌리기 1
  • [BOJ1068] 트리
  • [코드트리 조별과제] 부분 수열의 합이 K (누적합)
l'avenirJun
l'avenirJun
  • l'avenirJun
    오늘도 꾸준히 개발
    l'avenirJun
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 📚 개발자의 서재 N
        • 객체지향의 사실과 오해
        • Good Code, Bad Code
        • 도메인 주도 개발 시작하기 N
      • 🔧 트러블 슈팅
      • Java
      • Spring
      • 운영체제
        • 공룡책 학습
      • 알고리즘
      • GIT
      • 면접 지식
      • Spring 단기심화 2기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    객체
    good code bad code
    책임
    도메인 주도 개발 시작하기
    타입
    일반화
    메시지
    추상화
    캡슐화
    도메인 모델
    객체지향의 사실과 오해
    코딩테스트
    오블완
    티스토리챌린지
    애그리거트
    코드 계약
    애그리거트 루트
    매핑 구현
    유스케이스
    코드트리
    코딩트리조별과제
    리포지터리
    specification
    책임-주도 설계
    가독성
    역할
    협력
    DIP
    인터페이스
    모듈화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
l'avenirJun
[Boj2240] 자두나무
상단으로

티스토리툴바