CHNTOWER - Tháp Hà Nội

Tác giả: RR

Ngôn ngữ: C++

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <string>
#include <deque>
#include <complex>

#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)
#define ll long long
#define F first
#define S second
#define PB push_back
#define MP make_pair
using namespace std;

const double PI = acos(-1.0);

unsigned ll f[66][66];

int main() {
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    
    FOR(r,1,64) FOR(n,1,64) f[n][r] = 10001110001110001110ULL;
    
    f[1][2] = 1;
    FOR(r,3,64) {
        f[1][r] = 1;
        FOR(n,2,64) {
            f[n][r] = 2*f[1][r] + f[n-1][r-1];
            FOR(k,2,n-1)
                f[n][r] = min(f[n][r], 2*f[k][r] + f[n-k][r-1]);
        }
    }
    f[64][3] = 2*f[63][3] + 1;
    int n, k;
    while (cin >> n >> k)
        cout << f[n][k] << endl;
    return 0;
}

Download