[ 백준 ] 11058 / 크리보드
# Appreciation
/*
* Problem :: 11058 / 크리보드
*
* Kind :: Dynamic Programming
*
* Insight
* - BFS 로 풀려다 실패
* + 중간상태가
* (현재 화면에 출력된 A 의 개수, 현재 클립보드에 저장된 A 의 개수, 버튼을 누른 횟수)
* 로 정의되는데...
* # 현재 화면에 출력된 A 의 개수와현재 클립보드에 저장된 A 의 개수가 같아도
* 버튼을 누른 횟수가 적으면 다시 방문처리를 해야한다
* # 이와 같은 접근방식으로 풀어보았는데 시간초과...
* -> max(현재 화면에 출력된 A 의 개수) 와 max(현재 클립보드에 저장된 A의 개수)
* 가 생각보다 커서 탐색해야하는 공간이 굉장히 넓나보다
* (실제로 N=100 일 때, 답이 1391569403904 이니...
* 모든 공간이 사용되는 것은 아니겠지만 그래도 너무 크다)
*
* - 복사, 붙여넣기가 문제다!
* dp[i] = 버튼을 i 번 눌렀을 때 화면에 출력할 수 있는 A 개수의 최댓값
* 이라고 정의내리면 이 복사, 붙여넣기의 경우들을 잘 다룰 수 있나?
* + dp[i] 가 있을 때
* dp[i-3] 에서 Ctrl-A, Ctrl-C, Ctrl-V 한 결과와 비교해야 함
* dp[i-4] 에서 Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V 한 결과와 비교해야 함
* dp[i-5] 에서 Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V, Ctrl-V 한 결과와 비교해야 함
* ...
* # i 번 미만을 눌렀을 때 화면에 출력할 수 있는 A 개수의 최댓값을 알고 있으면
* 그 정보를 바탕으로 복사, 붙여넣기를 했을 때
* dp[i] 를 구하는데 도움이 된다!
* -> O(n^2) 이면 충분히 시간 제한 내에 풀 수 있다 <= max(N) 이 100 이므로
*
* Point
* - dp[1] ~ dp[100] 까지의 값을 콘솔에 출력해보니
* int 로 선언했을 때 값이 단조증가 하지 않았다
* + Overflow 가 발생하였구나~
* long 으로 선언하니 값이 단조증가 하였다
* # 버튼을 누른 횟수가 많아지면 당연히 화면에 출력할 수 있는 A 개수도 증가해야 할 테니까
*/
# Code
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N; cin >> N;
// Process
long dp[N+1]; /* dp[i] = 버튼을 i 번 눌렀을 때 화면에 출력할 수 있는 A 개수의 최댓값 */
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
for (int i=4; i<=N; i++) {
dp[i] = i; /* 1번 버튼만 눌렀을 때 */
for (int j=1; j<=i-3; j++) {
/* dp[j] 를 붙여넣기 할 수 있는 횟수 : i-j-2
* 화면에 출력된 A 개수
* = (붙여넣기 전 화면에 출력된 A 의 개수) + (붙여넣기 한 A 의 개수)
* = dp[j] + dp[j] * (i-j-2)
* = dp[j] * (i-j-1) */
dp[i] = max(dp[i], dp[j]*(i-j-1));
}
}
// Control : Output
cout << dp[N] << endl;
}
// Helper Functions
/* None */
Author And Source
이 문제에 관하여([ 백준 ] 11058 / 크리보드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@gglifer/백준-11058-크리보드
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
/*
* Problem :: 11058 / 크리보드
*
* Kind :: Dynamic Programming
*
* Insight
* - BFS 로 풀려다 실패
* + 중간상태가
* (현재 화면에 출력된 A 의 개수, 현재 클립보드에 저장된 A 의 개수, 버튼을 누른 횟수)
* 로 정의되는데...
* # 현재 화면에 출력된 A 의 개수와현재 클립보드에 저장된 A 의 개수가 같아도
* 버튼을 누른 횟수가 적으면 다시 방문처리를 해야한다
* # 이와 같은 접근방식으로 풀어보았는데 시간초과...
* -> max(현재 화면에 출력된 A 의 개수) 와 max(현재 클립보드에 저장된 A의 개수)
* 가 생각보다 커서 탐색해야하는 공간이 굉장히 넓나보다
* (실제로 N=100 일 때, 답이 1391569403904 이니...
* 모든 공간이 사용되는 것은 아니겠지만 그래도 너무 크다)
*
* - 복사, 붙여넣기가 문제다!
* dp[i] = 버튼을 i 번 눌렀을 때 화면에 출력할 수 있는 A 개수의 최댓값
* 이라고 정의내리면 이 복사, 붙여넣기의 경우들을 잘 다룰 수 있나?
* + dp[i] 가 있을 때
* dp[i-3] 에서 Ctrl-A, Ctrl-C, Ctrl-V 한 결과와 비교해야 함
* dp[i-4] 에서 Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V 한 결과와 비교해야 함
* dp[i-5] 에서 Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V, Ctrl-V 한 결과와 비교해야 함
* ...
* # i 번 미만을 눌렀을 때 화면에 출력할 수 있는 A 개수의 최댓값을 알고 있으면
* 그 정보를 바탕으로 복사, 붙여넣기를 했을 때
* dp[i] 를 구하는데 도움이 된다!
* -> O(n^2) 이면 충분히 시간 제한 내에 풀 수 있다 <= max(N) 이 100 이므로
*
* Point
* - dp[1] ~ dp[100] 까지의 값을 콘솔에 출력해보니
* int 로 선언했을 때 값이 단조증가 하지 않았다
* + Overflow 가 발생하였구나~
* long 으로 선언하니 값이 단조증가 하였다
* # 버튼을 누른 횟수가 많아지면 당연히 화면에 출력할 수 있는 A 개수도 증가해야 할 테니까
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N; cin >> N;
// Process
long dp[N+1]; /* dp[i] = 버튼을 i 번 눌렀을 때 화면에 출력할 수 있는 A 개수의 최댓값 */
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
for (int i=4; i<=N; i++) {
dp[i] = i; /* 1번 버튼만 눌렀을 때 */
for (int j=1; j<=i-3; j++) {
/* dp[j] 를 붙여넣기 할 수 있는 횟수 : i-j-2
* 화면에 출력된 A 개수
* = (붙여넣기 전 화면에 출력된 A 의 개수) + (붙여넣기 한 A 의 개수)
* = dp[j] + dp[j] * (i-j-2)
* = dp[j] * (i-j-1) */
dp[i] = max(dp[i], dp[j]*(i-j-1));
}
}
// Control : Output
cout << dp[N] << endl;
}
// Helper Functions
/* None */
Author And Source
이 문제에 관하여([ 백준 ] 11058 / 크리보드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gglifer/백준-11058-크리보드저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)