계단 오르기(2579)
i번째 계단에 오를 떄, 몇 개의 연속한 계단을 올랐는지를 고려하여 부분 문제를 정의
Last updated
i번째 계단에 오를 떄, 몇 개의 연속한 계단을 올랐는지를 고려하여 부분 문제를 정의
Last updated
6
10
20
15
25
10
2075import java.io.*;
import java.util.*;
public class Main{
static int stairs[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
stairs = new int[N + 1];
for (int i = 1; i <= N; i++) {
stairs[i] = Integer.parseInt(br.readLine());
}
int dp[] = new int[N+1];
dp[1] = stairs[1];
//여기 부분을 생각못함 : 만약 2일떄는 그냥 맨처음꺼랑 두번째껏만 더해야하니까따로처리해주고
if(N>=2){
dp[2] = stairs[1]+stairs[2];
}
//여기서부터 알고리즘 들어갈때는 3부터 시작
for(int i=3; i<=N; i++){
dp[i] = Math.max(dp[i-3]+stairs[i-1]+stairs[i], dp[i-2]+stairs[i]);
}
System.out.println(dp[N]);
}
}import java.io.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
int[] arr = new int[n+2];
int[] dp = new int[n+2];
for(int i=1; i<=n; i++){
arr[i] = Integer.parseInt(bf.readLine());
}
dp[1] = arr[1];
dp[2] = Math.max(arr[2] + arr[1], arr[2]);
for(int i=3; i<n+1; i++){
dp[i] = Math.max((arr[i]+dp[i-2]), (arr[i]+ arr[i-1] + dp[i-3]));
}
System.out.println(dp[n]);
}
}