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 

小结:

完全背包模板

posted @ 2022-05-06 20:27  tyrii  阅读(57)  评论(0)    收藏  举报