0
点赞
收藏
分享

微信扫一扫

Palindrome Basis(完全背包)

互联网码农 2022-05-05 阅读 48

LINK

题目:

在这里插入图片描述

大致翻译:

一个数字由数字回文串相加,问有多少种组合情况。

思路:

由完全背包可得:
d p [ i ] [ j ] : dp[i][j]: dp[i][j]: i i i个物品随意取,组成总体积为 j j j的方法数。
由此思路可得前 i i i个回文数里,相加之和为 j j j的方法数。
再转换为一维可得:
转换公式为:

dp[j]=(dp[j]+dp[j-v[i]])%mod;

代码:

#include <bits/stdc++.h>
using namespace std;
//#define ll long long
#define int long long
const int N=1e5+10;
const int NB=64;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
vector<int>v;
void init(){
	string s,ss;
	for(int i=0;i<=4e4;i++){
		s=ss=to_string(i);
		reverse(s.begin(),s.end());
		if(s==ss){
			v.push_back(i);
		}
	}
}
int dp[N];
signed main() {
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	init();
	dp[0]=1;
	for(int i=1;i<v.size();i++){
		for(int j=v[i];j<=4e4;j++){
			dp[j]=(dp[j]+dp[j-v[i]])%mod;
		}
	}
	int t,n;cin>>t;
	while(t--){
		cin>>n;
		cout<<dp[n]<<endl;
	}
	return 0;
}
举报

相关推荐

0 条评论