题意是说给你任意一个数n,用回文数凑出n ,问有多少种凑出n的方法
先预处理一下40000以内的回文数,存入vector中
剩下的就是一个完全背包模型啦(这篇有讲背包嗷 →动态规划背包问题
用dp[i]表示数字i满足条件的拆分数,对于num中的数字v,推出状态转移方程dp[i]=dp[i]+dp[i-v]
然后就可以写出代码了
int T;
const int mod = 1e9 + 7;
int f[40010];
signed main() {
vector<int> num;
string s, t;
for (int i = 1; i <= 40000; i++) {
s = to_string(i);
t = s;
reverse(t.begin(), t.end());
if (s == t) num.push_back(i);
}
int sz = num.size();
f[0] = 1;
for (int i = 1; i <= sz; i++) {
int v = num[i - 1];
for (int j = v; j <= 40000; j++)
f[j] = (f[j] + f[j - v]) % mod;
}
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
cout << f[n] << endl;
}
return 0;
}