/* O(n**d * n) dynamic programming approach using recursion. To keep track of already calculated positions one can use one number instead of a vector of ccordinates if represent a vector as a D-base number. */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; long long dp[(1<<16)]; int n, d; const long long inf = 1E18; int get(const vector&x) { int res = 0; for (int i=0; i&x) { int a = 0, b = 0; for (int i=0; i&pos) { int id = get(pos); if ( dp[id] != -1 ) return dp[id]; if ( id == 0 ) { dp[id] = 0; return 0; } dp[id] = inf; vectorgo = pos; long long cost = penalty(pos), mint = inf; for (int i=0; i 0 ) { go[i]--; mint = min( mint, rec(go) ); go[i]++; } } dp[id] = mint + cost; return dp[id]; } void solve() { cin>>n>>d; memset(dp, -1, sizeof(dp)); vectorstart; for (int i=1; i<=n; i++) start.push_back(d-1); cout<>test; while ( test-- ) solve(); return 0; }