题意

询问区间[a,b]中的Mirror Number的个数,其中Mirror Number是指把它横着翻转后还能表示同样的数字。

思路

注意这个可不是回文数。。除了0,1,8,别的数字翻转过后就不是数字了。所以策略就是记忆化按位搜索,每位只搜0,1,8,最后再判断是否回文,统计即可。这个判断回文是个小麻烦,因为它需要和前面的位相比较,所以用一个全局数组tmp[]表示枚举的每位的数字。

回过头来我觉得设置全局变量似乎不是一个好方法……它应该会破坏DP数组的区间唯一性……

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;

typedef long long LL;
typedef vector VI;
typedef set SETI;
typedef queue QI;
typedef stack SI;

char num[50];
LL dp[47][47][2];
int tmp[50];
LL dfs(int pos, int start, bool flag, bool limit){
if (pos==-1) return flag;
if (!limit && ~dp[pos][start][flag]) return dp[pos][start][flag];
int end = limit?(num[pos]-48):9;
LL res = 0;
for (int i = 0; i <= end; i ++)
if (i == 0 || i == 1 || i == 8){
bool st = (start==pos && i == 0);
bool next_flag = flag;
if (flag){
if (!st && pos < (start+1)/2)
next_flag = (i == tmp[start-pos]);
}
tmp[pos] = i;
res += dfs(pos-1, st?start-1:start, next_flag, limit&&(i==end));
}
return limit ? res : dp[pos][start][flag] = res;
}
LL solve(char x[]){
int len = strlen(x);
for (int i = 0; i < len; i ++){
num[i] = x[len-1-i];
}
num[len] = 0;
return dfs(len-1, len-1, 1, 1);
}
int main(){
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int t;
char a[50], b[50];
scanf("%d", &t);
getchar();
MEM(dp, -1);
while(t --){
scanf("%s %s", a, b);
LL res = solve(b)-solve(a);
int len = strlen(a);
bool ok = true;
for (int i = 0; i < len; i ++){
if ((a[i] != '0' && a[i] != '1' && a[i] != '8')||(a[i] != a[len-1-i])){
ok = false;
break;
}
}
if (ok)
res ++;
printf("%lld\n", res);
}
return 0;
}
[/cpp]

SPOJ MYQ10 (数位DP)的更多相关文章

  1. SPOJ KPSUM ★(数位DP)

    题意 将1~N(1<=N<=10^15)写在纸上,然后在相邻的数字间交替插入+和-,求最后的结果.例如当N为12时,答案为:+1-2+3-4+5-6+7-8+9-1+0-1+1-1+2=5 ...

  2. CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)

    题意 求[X,Y]区间内能被其各位数(除0)均整除的数的个数. CF 55D 有些时候因为问题的一些"整体性"而导致在按位统计的过程中不能顺便计算出某些量,所以只能在枚举到最后一位 ...

  3. SPOJ - BALNUM 数位dp

    题意:求某一区间内的平衡数个数(指一个数,其中出现过的数,如果是偶数,那么必须出现奇数次,反之偶数次) 题解:用三进制来枚举(0到9)所有情况,0代表没有出现,1代表出现奇数次,2代表出现偶数次dp[ ...

  4. 【SPOJ 2319】 BIGSEQ - Sequence (数位DP+高精度)

    BIGSEQ - Sequence You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need ...

  5. 【SPOJ 1182】 SORTBIT - Sorted bit squence (数位DP)

    SORTBIT - Sorted bit squence no tags Let's consider the 32 bit representation of all integers i from ...

  6. SPOJ BALNUM - Balanced Numbers - [数位DP][状态压缩]

    题目链接:http://www.spoj.com/problems/BALNUM/en/ Time limit: 0.123s Source limit: 50000B Memory limit: 1 ...

  7. SPOJ BALNUM Balanced Numbers (数位dp)

    题目:http://www.spoj.com/problems/BALNUM/en/ 题意:找出区间[A, B]内所有奇数字出现次数为偶数,偶数字出现次数为计数的数的个数. 分析: 明显的数位dp题, ...

  8. 数位DP:SPOJ KPSUM - The Sum

    KPSUM - The Sum One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that ...

  9. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

随机推荐

  1. ruby 修改Setting config yaml内容

    参考:http://ruby-doc.org/stdlib-1.9.3/libdoc/yaml/rdoc/YAML/Store.html 本事例只为说明如何修改yml文件内容. 一.需求是怎么样修改y ...

  2. Bridge Serial-Ports over network

    https://stackoverflow.com/questions/29207980/bridge-serial-ports-over-network For an application, wh ...

  3. 分布式远程服务调用(RPC)框架

    分布式远程服务调用(RPC)框架 finagle:一个支持容错,协议无关的RPC系统 热门度(没变化) 10.0 活跃度(没变化) 10.0  Watchers:581 Star:6174 Fork: ...

  4. 通过Java编码获取String分行字符串的内容

    代码案列: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException ...

  5. Spark高级数据分析· 3推荐引擎

    推荐算法流程 推荐算法 预备 wget http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz cd /Us ...

  6. 关于HttpRuntime.Cache的运用

    存Cache方法: HttpRuntime.Cache.Add( KeyName,//缓存名 KeyValue,//要缓存的对象 Dependencies,//依赖项 AbsoluteExpirati ...

  7. golang test 单元测试

    golang自家的单元测试做的很好了,自需要"文件名_test.go" 就可以在里面写单元测试,而且go test命令也很强大,可以只运行单个测试函数,在goland 可以点击单元 ...

  8. Linux内存管理的基本框架⭐⭐

    Linux内核的映射机制设计成三层,在页面目录和页面表中间增设了一层“中间目录”.在代码中,页面目录称为PGD,中间目录称为PMD,而页面表称为PT.PT中的表项称为PTE,PTE是“Page Tab ...

  9. nodeJs和JavaScript的异同

    JavaScript组成:ECMAScript(定义这门语言的基础,比如语法.数据类型.结构以及一些内置对象等).DOM(基于ECMASCRIPT,扩展出来的用于操作页面元素的方法).BOM(基于EC ...

  10. java 二维码生成

    直接上代码: 二维码生成核心类: package com.bbkj.wechat.tool; import java.awt.image.BufferedImage; import java.io.F ...