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 p;
vector 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';
}

posted @ 2025-09-05 09:51  _Yxc  阅读(34)  评论(0)    收藏  举报