#include <iostream>
#include <map>
#include <tuple>
int WeightImpl(int i, int q, int d); // forward declaration
// Use memoization and use `WeightImpl` for the real computation
int Weight(int i, int q, int d){
static std::map<std::tuple<int, int, int>, int> memo;
auto it = memo.find(std::make_tuple(i, q, d));
if (it != memo.end()) {
return it->second;
}
const int res = WeightImpl(i, q, d);
memo[std::make_tuple(i, q, d)] = res;
return res;
}
// Do the real computation
int WeightImpl(int i, int q, int d){
int j, sum = 0;
if (i <= 0)
return 0;
else if (i == 1)
return 1;
for (j = 1; j <= d; j++){
sum += Weight((i - j), q, d); // Call the memoize version to save intermediate result
}
sum = 1 + ((q - 1) * sum);
return sum;
}
int main() {
std::cout << Weight(6, 5, 3) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dHVwbGU+CgppbnQgV2VpZ2h0SW1wbChpbnQgaSwgaW50IHEsIGludCBkKTsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgoKLy8gVXNlIG1lbW9pemF0aW9uIGFuZCB1c2UgYFdlaWdodEltcGxgIGZvciB0aGUgcmVhbCBjb21wdXRhdGlvbgppbnQgV2VpZ2h0KGludCBpLCBpbnQgcSwgaW50IGQpewogICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludD4sIGludD4gbWVtbzsKCiAgICBhdXRvIGl0ID0gbWVtby5maW5kKHN0ZDo6bWFrZV90dXBsZShpLCBxLCBkKSk7CiAgICBpZiAoaXQgIT0gbWVtby5lbmQoKSkgewogICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogICAgfQogICAgY29uc3QgaW50IHJlcyA9IFdlaWdodEltcGwoaSwgcSwgZCk7CiAgICBtZW1vW3N0ZDo6bWFrZV90dXBsZShpLCBxLCBkKV0gPSByZXM7CiAgICByZXR1cm4gcmVzOwp9CgovLyBEbyB0aGUgcmVhbCBjb21wdXRhdGlvbgppbnQgV2VpZ2h0SW1wbChpbnQgaSwgaW50IHEsIGludCBkKXsKICAgIGludCBqLCBzdW0gPSAwOwogICAgaWYgKGkgPD0gMCkKICAgICAgICByZXR1cm4gMDsKICAgIGVsc2UgaWYgKGkgPT0gMSkKICAgICAgICByZXR1cm4gMTsKICAgIGZvciAoaiA9IDE7IGogPD0gZDsgaisrKXsKICAgICAgICBzdW0gKz0gV2VpZ2h0KChpIC0gaiksIHEsIGQpOyAvLyBDYWxsIHRoZSBtZW1vaXplIHZlcnNpb24gdG8gc2F2ZSBpbnRlcm1lZGlhdGUgcmVzdWx0CiAgICB9CiAgICBzdW0gPSAxICsgKChxIC0gMSkgKiBzdW0pOwogICAgcmV0dXJuIHN1bTsKfQoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgV2VpZ2h0KDYsIDUsIDMpIDw8IHN0ZDo6ZW5kbDsKfQ==