C. Palindrome Basis
https://codeforces.com/problemset/problem/1673/C
题意:给定一个数n,问这个数字由若干个回文数字相加得到的方案数是多少。
思路:背包问题,预处理范围内所有的回文数字,再完全背包处理即可(物品不限数量,背包容量从小到大考虑)
总结:物品在外背包在内,为什么?因为物品在内的话,那么比如有物品1, 2 在考虑物品1时有dp[3] += dp[2], 考虑物品2时有dp[3] += dp[1],这会造成dp[3]包含两个(2, 1)和(1, 2)
constexpr int N = 4e4 + 1;
vector<int> p;
vector<MInt> dp(N);
inline void preProcess() {
auto isPar = [](int i) {
int x = i;
int y = 0;
while (x) {
y = y * 10 + x % 10;
x /= 10;
}
return y == i;
};
for (int i = 1; i < N; ++i) {
if (isPar(i)) {
p.push_back(i);
}
}
dp[0] = 1;
for (const auto& v : p) {
for (int i = v; i < N; ++i) {
dp[i] += dp[i - v];
}
}
}
inline void solve() {
int n;
cin >> n;
cout << (dp[n]) << '\n';
}

浙公网安备 33010602011771号