728x90
반응형
https://www.acmicpc.net/problem/2156
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
|
import java.util.Scanner;
public class Main {
public static int n;
public static int[] arr;
public static int[] dp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
arr = new int[n + 2];
dp = new int[n + 2];
int count = 0;
for (int i = 1; i <= n; i++) {
arr[i] = sc.nextInt();
}
dp[1] = arr[1];
dp[2] = arr[2] + arr[1];
for (int i = 3; i <= n; i++) {
dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + arr[i], dp[i - 3] + arr[i - 1] + arr[i]));
}
System.out.println(dp[n]);
}
}
|
cs |
누적한 값을 이용해서 풀어야겠다고 생각이들었다.(당연히 dp니까!)
dp[1]=6
dp[2]=16
dp[3]=23
이런 식으로 진행되고, 점화식을 세워야 겠다고 생각했다.
n이 3이고 6,10,13이 있을 때 최대값은 6,10 -->16 일 수도 있고, 10,13-->23 일수도 있다.
이런 경우 최대값이 23일 수 있게 점화식을 만드는게 중요했다.
내가 간과한 것은 Math.max 안에 Math.max가 하나 더 들어갈 수 있던 것이였다!
Math.max가 하나 더 들어간다는 것은 비교대상이 더 늘어났다는 것인데
이는 A방법과 B방법끼리의 비교가 늘어났다는 것이다.
그렇기에 이것을 코드로 옮기면
Math.max(dp[i-1],Math.max(dp[i-2]+arr[i],dp[i-3]+arr[i-1]+arr[i])
풀면서 틀린 부분
dp[i]=Math.max(dp[i-1],dp[i-2]+arr[i]) 까지는 생각해냈지만, 이럴 경우 n이 5일 때는 만족하지만 3,4일 때는 만족을 하지 않았다. 어기서 max가 두번 들어갈 수 있다는 것을 생각하지 못한게 첫번째로 틀린 부분이고,
dp[4]=28 인데 dp[4]=25라 두고 풀어서 규칙을 제대로 구하지 못한게 두번째로 틀린부분이다.
좀더 꼼꼼하게 규칙을 찾아야겠다는 생각이 들었다.
728x90
반응형
'알고리즘 > DP' 카테고리의 다른 글
[java 백준] 실버 2/11722번 가장 긴 감소하는 부분 수열 (0) | 2021.08.04 |
---|---|
[java 백준] 실버 2/11053번 가장 긴 증가하는 부분 수열 (0) | 2021.08.04 |
[java 백준] 실버2 /9465번 스티커 (0) | 2021.08.03 |
[java 백준] 실버 1/11057번 오르막수 (0) | 2021.08.02 |
[java 백준] 실버 1/ 10844번 쉬운 계단 수 (0) | 2021.08.01 |
댓글