codeforce1673C. Palindrome Basis
传送门:今天不学习,明天变辣鸡
简述一下题意:给出一个n,求有多少回文数相加的方式等于n。
其中4 = 1+2+1 和 4 = 2+1+1为一种相加方式,要求方式间至少要有一个数字不同,才能叫做不同方式。
首先,n<4e4的,而且还是仅考虑范围中的回文数,所以实际的数据量是很小的,不会超过1e3,所以写个最暴力的dp也才4e7的计算量,给2s的时间绝对够了。
怎么判断回文数见代码实现。
然后就是如何设计递推公式和dp数组了。这个我也没想出来,直接看的tutorial。
记dp[k][m]表示前m个回文数相加为k的方式数。这里m虽然限定范围在前m个,但是并不是m个数字都要使用。
递推公式:其中pm为第m个回文数。
d p [ k ] [ m ] = d p [ k ] [ m − 1 ] + d p [ k − p m ] [ m ] dp[k][m] = dp[k][m-1] + dp[k-p_m][m] dp[k][m]=dp[k][m−1]+dp[k−pm][m]
前m个回文数构成k,可由两个状态推导,前m-1个数组成k的方式数+前m个回文数组成k-pm的方式数。不难看出,组成k的加数是有序的,所以不会出现重复的情况,也就是说只会有5=1+2+2,而不会出现5=2+1+2这种情况。
此外注意到递推式的最后一项,为什么是 d p [ k − p m ] [ m ] dp[k-p_m][m] dp[k−pm][m]而不是 d p [ k − p m ] [ m − 1 ] dp[k-p_m][m-1] dp[k−pm][m−1]呢?首先,题目中没有规定回文数只能使用一次,是可以多次使用的。如果换成 d p [ k − p m ] [ m − 1 ] dp[k-p_m][m-1] dp[k−pm][m−1],则表示加上pm后,从前m-1个回文数增加到前m个;忽略了加pm后,仍然是前m个不变的情况。
至于二层循环的执行顺序,只要保证dp[i][j]计算前,依赖项被完全计算即可。
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;template<class T> void _deb(const char *name,T val){cout<<name<<val<<endl;
}
const int MAXN = 4e4+2;
const ll MOD = 1e9+7;int t,n;
ll dp[MAXN][500];
vector<int> palindromes;bool isPalindrome(int n);
int main(){ios::sync_with_stdio(false);cin.tie(NULL);// find all palindrome at range less than MAXNrep(i,1,MAXN)if(isPalindrome(i)){palindromes.push_back(i);}rep(i,0,MAXN) {dp[i][1] = 1;dp[0][i] = 1;}int len = palindromes.size();rep(i,1,len) {int ind = i+1; // pos in dpint num = palindromes[i];rep(j,1,MAXN){dp[j][ind] = (dp[j][ind-1] + ((j-num>=0)? dp[j-num][ind]:0)) % MOD;}}scanf("%d",&t);while(t--) {scanf("%d",&n);printf("%d\n", dp[n][len]);}re 0;
}
bool isPalindrome(int n) {int s = n;int _reverse = 0;while(s){_reverse = _reverse*10 + (s%10);s = s / 10;}return n==_reverse;
}
codeforce1673C. Palindrome Basis相关推荐
- C. Palindrome Basis 完全背包 回文串
链接:https://codeforces.com/contest/1673/problem/C 对于每个回文串,都有取和不取两种作法,而且数量不做限制,故用完全背包. 设i为回文串,则有状态转移方程 ...
- 蓝桥杯部分题型(奇怪的比赛,电话号码,palindrome)
关与作者更多博客请访问云里云外开源社区 文章目录 2. 奇怪的比赛 3. palindrome 先来一段自己的翻译 4. 电话号码(其他来源,请参考) 未完待续! 2. 奇怪的比赛 某电视台举办了低碳 ...
- 【LeetCode】Palindrome Partitioning 解题报告
[题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...
- 234. Palindrome Linked List - Easy
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- LeetCode 125 Valid Palindrome(有效回文)(*)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/5062 ...
- Lintcode108 Palindrome Partitioning || solution 题解
[题目描述] Given a strings, cutsinto some substrings such that every substring is a palindrome. Return t ...
- 数位DP 回文序列 POJ-3280 Cheapest Palindrome
Cheapest Palindrome [ POJ - 3280 ] 题目大意: 给定字符串s,长度为m,由n个小写字母组成.在s的任意位置增删字母,把它变成回文串,增删特定字母的花费不同,求最小花费 ...
- RBF(Radial Basis Function Network)+径向基网络
RBF(Radial Basis Function Network)+径向基网络 在SVM中引入Gaussian Kernel就能在无限多维的特征转换中得到一条"粗壮"的分界线(或 ...
- Determine whether an integer is a palindrome. Do this without extra space.
看到这个题目的时候,首先不认识 Determine这个单词.英文不好没办法,查了下是确认的意思,然后不懂 palindrome这个单词, 查了下是回文的意思. 问题是 回文是个什么东西,官方解释: A ...
最新文章
- python爬虫数据提取,Python 信息提取-爬虫,爬虫提取数据, import re
- C语身教程第七章:布局与联结(5)
- Android 热修复 HotFix 混淆apk生成patch包方案
- Redis 缓存数据库
- 汇编语言 明明定义了栈仍然no stack segment 以及栈空间数据被篡改问题
- lambda的用法与实例(转载)
- oracle数据泵索引创建慢,IMPDP 很慢的原因探究
- javascript 代码_如何使您JavaScript代码简单易读
- [转载] 民兵葛二蛋——第27集
- python字符串取消转义_python取消转义,除了r还有什么?可以调用函数取消转义吗?...
- Python 之 单例
- scp 跨机远程拷贝
- input type类型_005 类型转换,我的存款是负值
- 给Activity设置背景色
- 多视角子空间学习系列之 CCA 典型相关分析
- 批处理访问域服务器文件夹,批处理如何访问域共享文件夹
- JavaScript+css+html鼠标指针经过某些元素时背景变色
- CTF Blind pwn题型学习笔记
- 如何使用Python itchat库玩转微信, 统计好友信息, 设置自动回复和发送本地文件...
- FTP上传文件提示550错误原因分析。