黑魔法
创建多维 vector
需要 C++14 及以上
不可初始化值的版本:
template <typename T>
std::vector<T> create_nd_vector(size_t size) {
return std::vector<T>(size);
}
template <typename T, typename... Sizes>
auto create_nd_vector(size_t first, Sizes... sizes) {
return std::vector<decltype(create_nd_vector<T>(sizes...))>(
first, create_nd_vector<T>(sizes...));
}
void solve() {
int n;
cin >> n;
vector<string> a(n + 1);
auto b = create_nd_vector<int>(n + 1, n + 1, n + 1, n + 1);
cout << typeid(b).name() << endl;
}
带初始化值的版本,初始化值必须为第一个参数:
template <typename T>
std::vector<T> create_nd_vector(T value, size_t size) {
return std::vector<T>(size);
}
template <typename T, typename... Sizes>
auto create_nd_vector(T value, size_t first, Sizes... sizes) {
return std::vector<decltype(create_nd_vector<T>(value, sizes...))>(
first, create_nd_vector<T>(value, sizes...));
}
void solve() {
int n;
cin >> n;
vector<string> a(n + 1);
auto b = create_nd_vector<int>(n + 1, n + 1, n + 1, n + 1);
cout << typeid(b).name() << endl;
}
“动态”的 std::bitset
需要 C++14 及以上
来自 CF1856E2, 利用模板展开预定义大小为 的函数。
// bitset 优化可行性 01 背包(重量和价值相等的 01 背包)
template <int len = 1>
int knapsack01(const vector<int> &a, int target) {
if (target >= len) {
return knapsack01<min(len * 2, MAX_BITSET_SIZE)>(a, target);
}
bitset<len> dp;
dp[0] = 1;
for (auto x : a) {
dp |= dp << x;
}
for (int i = target; i >= 0; --i) {
if (dp[i]) {
return i;
}
}
return 0;
}