728x90
반응형
https://www.acmicpc.net/problem/11052
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
31
32
33
34
35
36
37
|
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 + 1];
dp = new int[n + 2];
for (int i = 1; i <= n; i++) {
arr[i] = sc.nextInt();
}
dp[1] = arr[1];
for (int i = 1; i <= n; i++) {
dp[i] = i;
for (int j = 1; j <= i; j++) {
dp[i] = Math.max(dp[i], dp[i - j] + arr[j]);
}
}
int max = dp[1];
for (int i = 1; i <= n; i++) {
if (max <= dp[i]) {
max = dp[i];
}
}
System.out.println(max);
}
}
|
cs |
정답률이 60프로에 달하는 쉬운 문제인데 나는 못풀었다 ㅜ 아무래도 이틀 쉬어서 그런건가
규칙을 눈앞에서 놓쳤다 (아직 실력부족이다 ㅜㅜㅜ)
n이 4이고 p1=1,p2=5,p3=6,p4=7일 때를 가정해보자
dp[n]은 지불해야할 카드 개수의 합을 저장한 배열이다.
dp[1]=1
dp[2]= arr[1]+dp[1]인 2 또는 arr[2]인 5 인데 여기서 큰 값은 5이다.
dp[3= dp[2]+arr[1],dp[1]+arr[2],dp[0]+arr[3] 중에 큰 값, 즉 6
dp[4]= dp[3]+arr[1],dp[2]+arr[2],dp[1]+arr[3],dp[0]+arr[4] 중에 큰 값이므로 10이다.
for (int i = 1; i <= n; i++) {
dp[i] = i;
for (int j = 1; j <= i; j++) {
dp[i] = Math.max(dp[i], dp[i - j] + arr[j]);
}
--> 이런 반복문을 찾아낼 수 있다.
내가 풀면서 놓친부분
1.반복문을 써서 dp[i]값을 초기화 시킬 수 있는 걸 생각못했다 (이젠 해야한다!)
--> 그래야 완전탐색으로 가장 큰 값을 찾아낼 수 있다
나는 Math.max안에 Math.max를 넣어서 코드를 꾸겨(?)넣었다 굳이 그렇게 할 필요 없었다.
2.dp와 arr과의 관계를 잡아서 점화식을 도출해 내지 못했다
728x90
반응형
'알고리즘 > DP' 카테고리의 다른 글
[java 백준] 골드 3/ 11054번 가장 긴 바이토닉 수열 (0) | 2021.08.15 |
---|---|
[java 백준] 실버 3/9461번 파도반 수열 (0) | 2021.08.10 |
[java 백준] 실버 3/1699번 제곱수의 합 (0) | 2021.08.07 |
[DP기초] 필요한 동전의 최소개수 구하기 (0) | 2021.08.06 |
[DP기초] 계단오르기 (0) | 2021.08.06 |
댓글