はまやんはまやんはまやん

hamayanhamayan's blog

Strange Bank [AtCoder Beginner Contest 099 C]

https://beta.atcoder.jp/contests/abc099/tasks/abc099_c

解説

https://beta.atcoder.jp/contests/abc099/submissions/2667784

メモ化再帰動的計画法)で解く。
「f(cu) := cu円引き出すのに必要な最小の操作回数」
と定義して、メモ化再帰を行う。
状態数はcuが0~Nだけ取りうるのでO(N)
 
遷移であるが、1円の遷移は別に大丈夫。
6の累乗円の遷移はすぐにNを超えてしまうので、O(logN)くらい
9の累乗円の遷移も同様。
よって、遷移数はO(logN)となる。
 
これでO(NlogN)なので間に合う。

int N;
//---------------------------------------------------------------------------------------------------
int memo[101010];
int f(int cu) {
    if (cu == 0) return 0;
    if (memo[cu]) return memo[cu];
 
    int res = inf;
    
    // 1yen
    chmin(res, f(cu - 1) + 1);
 
    // 6yen
    int x = 6;
    while (x <= cu) {
        chmin(res, f(cu - x) + 1);
        x *= 6;
    }
 
    // 9yen
    x = 9;
    while (x <= cu) {
        chmin(res, f(cu - x) + 1);
        x *= 9;
    }
 
    return memo[cu] = res;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    cout << f(N) << endl;
}