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';
}
posted @ 2025-09-05 09:51  _Yxc  阅读(13)  评论(0)    收藏  举报