传送门:今天不学习,明天变辣鸡

简述一下题意:给出一个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相关推荐

  1. C. Palindrome Basis 完全背包 回文串

    链接:https://codeforces.com/contest/1673/problem/C 对于每个回文串,都有取和不取两种作法,而且数量不做限制,故用完全背包. 设i为回文串,则有状态转移方程 ...

  2. 蓝桥杯部分题型(奇怪的比赛,电话号码,palindrome)

    关与作者更多博客请访问云里云外开源社区 文章目录 2. 奇怪的比赛 3. palindrome 先来一段自己的翻译 4. 电话号码(其他来源,请参考) 未完待续! 2. 奇怪的比赛 某电视台举办了低碳 ...

  3. 【LeetCode】Palindrome Partitioning 解题报告

    [题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...

  4. 234. Palindrome Linked List - Easy

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  5. LeetCode 125 Valid Palindrome(有效回文)(*)

    版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/5062 ...

  6. Lintcode108 Palindrome Partitioning || solution 题解

    [题目描述] Given a strings, cutsinto some substrings such that every substring is a palindrome. Return t ...

  7. 数位DP 回文序列 POJ-3280 Cheapest Palindrome

    Cheapest Palindrome [ POJ - 3280 ] 题目大意: 给定字符串s,长度为m,由n个小写字母组成.在s的任意位置增删字母,把它变成回文串,增删特定字母的花费不同,求最小花费 ...

  8. RBF(Radial Basis Function Network)+径向基网络

    RBF(Radial Basis Function Network)+径向基网络 在SVM中引入Gaussian Kernel就能在无限多维的特征转换中得到一条"粗壮"的分界线(或 ...

  9. Determine whether an integer is a palindrome. Do this without extra space.

    看到这个题目的时候,首先不认识 Determine这个单词.英文不好没办法,查了下是确认的意思,然后不懂 palindrome这个单词, 查了下是回文的意思. 问题是 回文是个什么东西,官方解释: A ...

最新文章

  1. python爬虫数据提取,Python 信息提取-爬虫,爬虫提取数据, import re
  2. C语身教程第七章:布局与联结(5)
  3. Android 热修复 HotFix 混淆apk生成patch包方案
  4. Redis 缓存数据库
  5. 汇编语言 明明定义了栈仍然no stack segment 以及栈空间数据被篡改问题
  6. lambda的用法与实例(转载)
  7. oracle数据泵索引创建慢,IMPDP 很慢的原因探究
  8. javascript 代码_如何使您JavaScript代码简单易读
  9. [转载] 民兵葛二蛋——第27集
  10. python字符串取消转义_python取消转义,除了r还有什么?可以调用函数取消转义吗?...
  11. Python 之 单例
  12. scp 跨机远程拷贝
  13. input type类型_005 类型转换,我的存款是负值
  14. 给Activity设置背景色
  15. 多视角子空间学习系列之 CCA 典型相关分析
  16. 批处理访问域服务器文件夹,批处理如何访问域共享文件夹
  17. JavaScript+css+html鼠标指针经过某些元素时背景变色
  18. CTF Blind pwn题型学习笔记
  19. 如何使用Python itchat库玩转微信, 统计好友信息, 设置自动回复和发送本地文件...
  20. FTP上传文件提示550错误原因分析。

热门文章

  1. 【运维心得】双宽带热备方案推荐
  2. epic怎么添加本地游戏_科技资讯:GTA5怎么免费领取
  3. android 键盘 自动消失,Android EditText点击弹出软键盘点击外部消失
  4. 物联网工程实训 第 4天
  5. 5-if语句(选择结构)
  6. linux篇-用户密码与登录安全策略设置
  7. matlab交互组合,Q:mdo/mdo2的使用方法(MATLAB交互)
  8. 投融界:创业路上,有项目如何找投资人
  9. 计算机常见命令(win键+R键)
  10. php中如何做出总价,对如何用JS算总价的详细讲解