[伯俊]11058キーボード


標準11058キーボード

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

  • 白駿14226のような表情の問題

  • 所定時間3秒未満の場合:
    前1秒状態にA=前1秒状態+1を追加

  • 指定した3秒以内に、可能な場合:
    3秒前選択、コピー、貼り付け状態前提=3秒前状態X 2

  • 指定された時間が4秒の場合、次のことが可能です.
    3秒前選択、コピー、貼付け全ての状態=3秒前状態X 2
    4秒前状態完全選択、コピー、貼り付け、貼り付け=4秒前状態X 3

  • 指定された時間が5秒の場合、次のことが可能です.
    3秒前選択、コピー、貼付け全ての状態=3秒前状態X 2
    4秒前状態完全選択、コピー、貼り付け、貼り付け=4秒前状態X 3
    5秒前状態完全選択、コピー、貼り付け、貼り付け、貼り付け=5秒前状態X 4

  • 指定された期間内で、可能な場合:
    (2+1)秒前状態=(2+1)秒前状態X(1+1)を選択、コピー、貼り付け
    (2+2)秒前状態=(2+2)秒前状態X(1+2)を選択、コピー、貼り付け
    ...
    (2+i)秒前状態選択、コピー、貼付け=(2+i)秒前状態X(1+i)
  • #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    const int MAX = 101;
    
    int N;
    long long cache[MAX];
    
    long long getScreen(int time){
    
    	long long &res = cache[time];
    	if (res != -1) return res;
    
    	//1초전 상태에 A 하나 추가
    	res = 1 + getScreen(time - 1);
    
    	if (time >= 3) {
    		//(time- 2 - i)초 상태에 CtrlA + CtrlC + Σ(CtrlV)
    		for (int i = 1; time - 2 - i >= 0 ; ++i) {
    			res = max(res, getScreen(time - 2 - i) * (i + 1));
    		}
    	}
    	return res;
    }
    
    
    
    int main(){
    
    	ios_base::sync_with_stdio(0);
    	cin.tie(NULL);
    	cout.tie(NULL);
    
    	memset(cache, -1, sizeof(cache));
    
    	cin >> N;
    
    	cache[0] = 0;
    	cout << getScreen(N);
    	return 0;
    }
    📌参考資料
  • 白準11058キーボードプール
    https://kibbomi.tistory.com/96
    https://jaimemin.tistory.com/1098