【LightOJ - 1205】Palindromic Numbers
【链接】https://cn.vjudge.net/problem/LightOJ-1205
【题意】
【题解】
其中start表示是从哪一位开始进行扫描的,这个东西用来处理前导0;
cur表示当前搜索到了第几位数字.
ok表示当前搜索到的字符串是否为回文.
xiao则表示是否出现已经搜索的某一位是小于所给的数字的对应位,如果有的话,之后的每一位枚举就能一直到9了.
然后我们可以这样写记搜。
设f[i][j][k]表示从start位开始搜索,然后当前搜索到第cur位,k=0表示是回文串,k=1表示不是回文串.(当然还没搜完,只能说它可能是回文串)的回文串个数.
可以肯定,如果xiao==1了,则无论数字是什么,后面的回文串个数都是一样的了
比如
所给数字
9323
先倒过来
3239
假设我们枚举第一位为1
1xxx
则这个时候start = 4,cur = 3 (我们是倒过来的),然后因为第一位小于3,所以xiao=1
则这个时候,后面3个位置,实际上只有第2位是需要枚举的了,因为后面的两位肯定是和前面的两位一样的.
(而且每一位都可以0..9任意选)
也就是说,这个时候,答案已经和所给的数字没有任何关系了.它是一个通式
也即这个时候往后算出来的答案f[start][cur][ok],在后序的搜索中如果遇到,是可以直接返回值的.
(注意只有在xiao==1的时候才能做记搜,因为如果xiao==0,显然之后位是有限制的,可能不是每一位都是0..9了)
【错的次数】
【反思】
【代码】
- #include <bits/stdc++.h>
- using namespace std;
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define LL long long
- #define rep1(i,a,b) for (int i = a;i <= b;i++)
- #define rep2(i,a,b) for (int i = a;i >= b;i--)
- #define mp make_pair
- #define pb push_back
- #define fi first
- #define se second
- #define ms(x,y) memset(x,y,sizeof x)
- #define ri(x) scanf("%d",&x)
- #define rl(x) scanf("%lld",&x)
- #define rs(x) scanf("%s",x)
- #define oi(x) printf("%d",x)
- #define ol(x) printf("%lld",x)
- #define oc putchar(' ')
- #define os(x) printf(x)
- #define all(x) x.begin(),x.end()
- #define Open() freopen("F:\\rush.txt","r",stdin)
- #define Close() ios::sync_with_stdio(0)
- typedef pair<int,int> pii;
- typedef pair<LL,LL> pll;
- const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
- const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
- const double pi = acos(-1.0);
- const int N = 100;
- LL a,b;
- int c[N+10],temp[N+10],dp[N+10][N+10][2];
- LL dfs(int start,int cur,bool ok,bool xiao){
- if (cur < 1) return ok;
- int limit = (xiao?9:c[cur]);
- if (xiao && dp[start][cur][ok]!=-1)
- return dp[start][cur][ok];
- LL ret = 0;
- rep1(i,0,limit){
- temp[cur] = i;
- if (i == 0 && start == cur){
- ret += dfs(start-1,cur-1,ok,xiao||(i < limit));
- }else
- if (ok && cur < (start+1)/2 + 1)
- ret += dfs(start,cur-1,temp[start-cur+1]==temp[cur],xiao||(i<limit));
- else
- ret += dfs(start,cur-1,ok,xiao||(i<limit));
- }
- if (xiao) dp[start][cur][ok] = ret;
- return ret;
- }
- LL f(LL x){
- if (x < 0) return 0;
- int len = 0;
- while (x){
- c[++len] = x%10;
- x/=10;
- }
- return dfs(len,len,1,0);
- }
- int main(){
- //Open();
- //Close();
- ms(dp,255);
- int T,kk = 0;
- ri(T);
- while (T--){
- rl(a),rl(b);
- if (a > b) swap(a,b);
- os("Case ");oi(++kk);os(": ");ol(f(b)-f(a-1));puts("");
- }
- return 0;
- }
【LightOJ - 1205】Palindromic Numbers的更多相关文章
- LightOJ - 1205:Palindromic Numbers (数位DP&回文串)
A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the sam ...
- LightOJ - 1396 :Palindromic Numbers (III)(逐位确定法)
Vinci is a little boy and is very creative. One day his teacher asked him to write all the Palindrom ...
- 【HDU 4722】 Good Numbers
[题目链接] 点击打开链接 [算法] f[i][j]表示第i位,数位和对10取模余j的数的个数 状态转移,计算答案都比较简单,笔者不再赘述 [代码] #include<bits/stdc++.h ...
- 【Codeforces 1036C】Classy Numbers
[链接] 我是链接,点我呀:) [题意] 让你求出只由3个非0数字组成的数字在[li,ri]这个区间里面有多少个. [题解] 只由3个非0数字组成的数字在1~10^18中只有60W个 dfs处理出来之 ...
- 【Codeforces 300C】Beautiful Numbers
[链接] 我是链接,点我呀:) [题意] 让你找到长度为n的数字 这个数字只由a或者b组成 且这n个数码的和也是由a或者b组成的 求出满足这样要求的数字的个数 [题解] 枚举答案数字中b的个数为y,那 ...
- 【CSU 1556】Pseudoprime numbers
题 Description Jerry is caught by Tom. He was penned up in one room with a door, which only can be op ...
- 【数位dp】Beautiful Numbers @2018acm上海大都会赛J
目录 Beautiful Numbers PROBLEM 题目描述 输入描述: 输出描述: 输入 输出 MEANING SOLUTION CODE Beautiful Numbers PROBLEM ...
- 【UVA - 136】Ugly Numbers(set)
Ugly Numbers Descriptions: Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequ ...
- 【Aizu - ALDS1_1_C】Prime Numbers(素数筛法)
Prime Numbers Descriptions: A prime number is a natural number which has exactly two distinct natur ...
随机推荐
- MountService整理
刚毕业时第一个接触的模块就是Vold.这个模块尽管小,但深入下去是有一定难度的. 花了点时间又一次整理了下这一块的逻辑,也当温习下这个模块. watermark/2/text/aHR0cDovL2Js ...
- 解决Android Studio 2.2.3中添加.cpp .h文件在Project->Android无法显示,无法正常编译问题。
搭配使用 Android Studio 2.2 或更高版本与 Android Plugin for Gradle 版本 2.2.0 或更高版本时,您可以将 C 和 C++ 代码编译到 Gradle 与 ...
- 深入理解Android(5)——从MediaScanner分析Android中的JNI
前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...
- c#时间差高精度检查
两个时间差的高精度检查 static void Main(string[] args) { Console.WriteLine("开始时间:" + DateTime.Now.ToS ...
- 如何在Ubuntu14.04中创建Python虚拟环境
在Ubuntu14.04中安装Python相对比较容易些,最简单的安装方法就是apt-get安装了,具体的教程可以戳这篇文章:在Ubuntu14.04中如何安装Python3和切换py2和py3环境. ...
- 关于IDEA无法完整显示项目文件结构
今天发现一个奇怪的问题,就是我从本地导入了文件,明明已经成功了,但是在我的项目结构里面就是不显示,然而点击目录, 又能打开相应的文件,如图所示: 其实这个打开的只是包文件,只需要如下图操作即可:
- Vue 项目搭建 与 git 连接
整理一下::::: git 方面: -----------注册------登录--------就不用写了 这里使用的是码云: 1. 进入个人中心添加项目. 2.添加完项目添加SSH公钥.(在设置里面) ...
- linux ifconfig找不到
提示命令不存在 原因: 系统默认的环境变量设置不对 而,ifconfig恰恰就在/sbin里面. 下cat /etc/profile, 可以发现没有关于/sbin的环境变量. Linux,习惯用ged ...
- 读MBA经历回想(下)做法决定结果——北漂18年(49)
上期聊了目的决定了手段,这次说说详细做法决定了最后的结果. 差额面试被淘汰的高分学员 2005年,是北京邮电大学工商管理学入学考试第一个差额淘汰的年份.意思是过分数线(165分)的人数超过了录取人数, ...
- vim 实际行跟屏幕行移动命令
我们使用vim的时候,经常会碰到那种情况,就是我们输入的内容过长,中间一直不换行.当我们一行的长度超出电脑屏幕的时候,我们会发现这时候文字自动换行了.不过,如果你使用行号看的话,其实这新的一行是没有行 ...