C. Palindrome Basis_完全背包
C. Palindrome Basis_完全背包
题目大意:
给若干个数字,问每个数字可以被多少种回文数字的组合相加得到。
思路和代码:
一开始想到了dp:fi表示构成i的种类然后做一个区间dp,但是转移过程中会有很多的重复,我不会处理...
但是可以用完全背包处理每一个数字。因为每个回文数在构造某个数字时可以用无限次。
bool ck(int x){
if(!x) return 1 ;
int y = 0 , t = x ;
while(x){
y = y * 10 + x % 10 ;
x /= 10 ;
}
return t == y ;
}
void solve(){
vct<int> pali ;
rep(i , 1 , 4e4)
if(ck(i)) pali.pb(i) ;
vct<ll> dp(4e4 + 5 , 0) ;
dp[0] = 1 ;
// cout << pali.size() << "\n" ;
for(int x : pali)
for(int i = x ; i <= 4e4 ; i ++ )
dp[i] = (dp[i] + dp[i - x]) % mod ;
int _ ; cin >> _ ;
while(_ -- ){
int x ; cin >> x ;
cout << dp[x] << "\n" ;
}
}//code_by_tyrii
小结:
完全背包模板

浙公网安备 33010602011771号