사용 알고리즘 : DP
어렵다... 처음 풀 땐 풀 수 있을 것 같았는데 해도 해도 답이 안 나와서 다른 블로그들 참조해보니 잘못된 방법으로 접근했었다
일단 2,3,4 연산은 이어져야 한다. 선택하고 복사하고 붙여 넣고.
그래서 N이 6까지는 무조건 i이다.
1
2
3
|
for(int i=1; i<=6; i++) {
dp[i]=i;
}
|
cs |
왜냐?
선택하고 복사하고 붙여 넣는 것의 최댓값을 구하기 위해선 화면에 최대한 A가 많아야 한다.
두 개를 붙여 넣는 것보다는 세 개를 붙여넣는 게 값이 더 크고 세개를 붙여 넣는것 보다는 네개를 붙여 넣는게 더 크다.
그럼 n이 6일 때 까진
A A A 선택 복사 붙여 넣기 를 할 경우
A A A A A A 6개다
그래서 1부터 6까지의 값은 미리 채워주었다. 이러한 생각은 도대체 어떻게 하는지 모르겠다 ㅠ
그리고 n이 7일 때를 생각해 보자
A A A A 선택 복사 붙여 넣기를 하면
A A A A A A A A 총 8개가 나온다
이후로도 복사 붙여 넣기를 하면 문제의 1번 버튼 화면에 A를 출력한다 이것은 한 개씩 늘어나니까
더 이상 고려할 필요가 없다.
문제에 나와있는 힌트인 위 사진을 보자.
매 단계마다 선택,복사,붙여 넣기 선택,복사,붙여넣기 이렇게만 할 수 있는것이 아니라
선택 복사 붙여 넣기 붙여넣기 붙여넣기 붙여넣기 이런식으로도 가능하다는 걸 알 수 있다.
이제 고려해줘야 할 건
A A A A A A A A A A x y z q
이렇게 있을 때
x 선택 y복사 z 붙여넣기 q 붙여넣기 넣기 이런 방법도 있고
y에서 선택 z 복사 q 붙여넣기 이런 방법도 있다.
1
2
3
4
5
6
7
8
|
for(int i=7; i<=n; i++) {
for(int j=3; j<=i; j++) {
long printed = dp[i-j];
long buf = dp[i-j];
int v_cnt = j-2;
}
}
|
일단 j가 3부터 시작하는 이유를 알아보자
기본적으로 선택 복사 붙여 넣기는 3개의 버튼을 이용해야 한다.
i가 6일 때까지 값은 위에서 구했으니
위 반복문의 제일 첫 번째 실행 i =7 j= 3 일 때
long printed = dp [7-3]
long buf = dp [7-3];
int v_cnt = 3-2;
dp [i-j]를 계산하면 dp [4]가 된다.
즉 dp [4]에서 3개의 버튼을 눌렀다고 가정을 하는 것이다.
맨 처음 선택 복사 붙여 넣기의 경우
printed = dp [4] (기존 화면 A의 개수)
buf = dp[4] (복사하는 과정)
v_cnt = 1 ( 붙여 넣기)
기존 화면 + 복사한 것 = printed + (buf * v_cnt);
이 과정을 하면 선택 복사 붙여 넣기가 완료된다
그다음 j가 4일 때를 보자
printed = dp [3];
buf = dp [3];
v_cnt = 2;
이 과정은 dp [3] + dp [3]*2
dp [3]에서 복사한걸 계속 붙여 넣는 것이다.
이런 식으로 비교를 해주면 된다.
순서는 대충 이렇다
A A A A 선택 복사 붙여 넣기
A A A 선택 복사 붙여넣기 붙여넣기
A A 선택 복사 붙여넣기 붙여넣기 붙여넣기
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
|
public class Main {
static int n;
static int max =1;
static long dp[];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
dp = new long[101];
for(int i=1; i<=6; i++) {
dp[i]=i;
}
for(int i=7; i<=n; i++) {
for(int j=3; j<=i; j++) {
long printed = dp[i-j];
long buf = dp[i-j];
int v_cnt = j-2;
}
}
for(int i=7; i<=n; i++) {
System.out.println(dp[i]);
}
System.out.println(dp[n]);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘' 카테고리의 다른 글
[백준 1495] 기타리스트 - JAVA // le_effort// (0) | 2020.03.10 |
---|---|
[백준 12865] 평범한 배낭 - JAVA // le_effort// (0) | 2020.03.10 |
[백준 2293] 동전 1 -JAVA //le_effort// (0) | 2020.03.10 |
[백준 15990] 1,2,3 더하기5 -JAVA //le_effort// (0) | 2020.03.09 |
[백준 15989] 1,2,3 더하기 4 -JAVA // le_effort// (1) | 2020.03.09 |