티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/14226

 

14226번: 이모티콘

영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만

www.acmicpc.net

 

풀이

현재 클립보드에 들어있는 이모티콘의 개수와, 화면에 나타난 이모티콘의 개수를 바탕으로 상태를 정의합시다.

$d[clip][screen]$: 클립보드에 $clip$개, 화면에 $screen$개 이모티콘이 있을 때 시간의 최솟값입니다.

 

한 상태에서 갈 수 있는 다른 상태가 명확합니다.

1) $clip$을 $screen$으로 변경

2) $screen$을 하나 삭제

3) $screen$을 $clip$만큼 증가

 

기저 값은 이모티콘이 대충 $2n$개를 넘으면 최적이 안될 것 같아 $2n$을 기준으로 설정했습니다.

정답 코드

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
using namespace std;

int d[2222][2222];
int n;

// 1) clip 변경
// 2) 실제 개수를 하나 삭제
// 3) 실제 개수를 clip 만큼 증가
int go(int clip, int screen) {
    if (screen > 2 * n || clip > 2 * n) return INF;
    if (screen < 0) return INF;
    if (screen == n) return 0;

    int &ret = d[clip][screen];
    if (ret != -1) return ret;
    ret = INF;
    ret = min(ret, go(screen, screen) + 1);
    ret = min(ret, go(clip, screen - 1) + 1);
    ret = min(ret, go(clip, screen + clip) + 1);
    return ret;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    memset(d, -1, sizeof(d));
    cin >> n;
    cout << go(0, 1);
}
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함