본문 바로가기
백준

[백준 11058] 크리보드, C++

by 황인태(intaehwang) 2020. 2. 16.
반응형

https://www.acmicpc.net/problem/11058

 

11058번: 크리보드

N = 3인 경우에 A, A, A를 눌러 A 3개를 출력할 수 있다. N = 7인 경우에는 A, A, A, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V를 눌러 9개를 출력할 수 있다. N = 11인 경우에는 A, A, A, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V 를 눌러 27개를 출력할 수 있다.

www.acmicpc.net

 본 문제는 크리보드의 버튼을 총 N번 눌러서 화면에 출력된 A개수를 최대 개수를 구하는 문제로 문제의 조건은 다음과 같다.

  1. 화면에 A를 출력한다.
  2. Ctrl-A: 화면을 전체 선택한다
  3. Ctrl-C: 전체 선택한 내용을 버퍼에 복사한다
  4. Ctrl-V: 버퍼가 비어있지 않은 경우에는 화면에 출력된 문자열의 바로 뒤에 버퍼의 내용을 붙여넣는다.

이때, 조건 2~4은 연속적으로 일어나야 의미가 있다. 따라서 조건 2~4은 하나의 조건으로 생각하는것이 좋다. 조건 4은 조건 2~3이 선행되었을 때 반복해서 누를수 있다. 즉, i를 버튼을 누른 횟수, j를 조건 4를 실행한 횟수, d[i]를 i번 버튼을 눌러 화면에 출력되는 A의 최대 개수라 하면 다음과 같은 점화식을 정의할 수 있다. d[i] = max(d[i-1] + 1, d[i-j] * (j-1)) (단, 3 ≤ j  i)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
 
using namespace std;
 
long long d[101];
 
int Max(int x, int y) {
    if (x < y) return y;
    else return x;
}
 
int main() {
    int n;
    scanf("%d"&n);
    d[0= 0;
    for (int i = 1; i <= n; i++) {
        d[i] = d[i-1+ 1;
        for (int j = 3; j <= i; j++) {
            if (d[i] < d[i-j]*(j-1)) d[i] = d[i-j]*(j-1);
        }
    }
    printf("%lld\n", d[n]);
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 5557] 1학년, C++  (0) 2020.02.17
[백준 1890] 점프, C++  (0) 2020.02.17
[백준 15486] 퇴사 2, C++  (0) 2020.02.13
[백준 1939] 중량제한, C++  (0) 2020.02.11
[백준 11725] 트리의 부모 찾기  (0) 2020.02.10
Buy me a coffeeBuy me a coffee

댓글