题目描述:

求给定区间中的回文数有多少个?

首先明确一点,如果一个数是回文数,那么给这个数两边加上相同的数,那么这个数还是回文数。

根据这点就可以进行递推了,p[start][end]=9*p[start+1][end-1](start位不为0)+p[start-1][end](start位为0);

在设计dfs的时候,由于回文数是对称的,所以只需要一个变量cur(cur>mid)就可以表示从cur到cur对称的位置的回文数的个数;

d[start][cur]表示从start位到cur位时,回文数的个数。

这句话隐含的意思是最高位为start,枚举到第cur位,由于是回文数,所以当cur>mid时,[cur,start]位确定,他们的对称位[1,start+1-cur]也就确定了,

还需枚举[cur,mid]这些位;当cur=mid时任意枚举,对回文数没有影响,当cur<mid时,由于是回文数,已经确定了,不需枚举。

再增加一维表示当前枚举的数字是不是回文数(([start,cur]位是否为回文数);

d[start][cur][state]表示从start位到cur位时,状态为state时回文数的个数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define LL long long
LL n,m;
LL d[][][];
int digit[];
int num[];
LL dfs(int start,int cur,int Zero,int state,bool fp)
{
if(!cur)
return state;
if(!fp && d[start][cur][state]!= -)
return d[start][cur][state];
LL ret = ;int fpmax = fp ? digit[cur] : ;
for(int i=;i<=fpmax;i++)
{
if( (Zero &&(i==)) )
ret+=dfs(start-,cur-,Zero&&(i==),state, fp&& i==fpmax);
else
{
num[cur]=i;
if( (start & )== )
{
int mid=((start+)>>);
if(cur== mid)
{
ret+=dfs(start,cur-,,state,fp&& i==fpmax);
}
else if(cur < mid )
{
ret+=dfs(start,cur-,,state&& (num[mid*-cur]==i),fp&& i==fpmax);
}
else if(cur>mid)
{
ret+=dfs(start,cur-,,state,fp&& i==fpmax);
}
}
else
{
int mid=(start>>)+;
if(cur<mid)
{
ret+=dfs(start,cur-,,state&& (num[start+-cur]==i),fp&& i==fpmax);
}
else
{
ret+=dfs(start,cur-,,state,fp&& i==fpmax);
}
}
}
}
if(!fp) //如果是前缀,当前得到的ret的值,就不能代表dp[len][state]的值
d[start][cur][state] = ret;
return ret;
} LL f(LL n)
{
int len = ;
if(n==-)
return ;
while(n)
{
digit[++len] = n % ;
n /= ;
}
LL answer=dfs(len,len,,,true);
return answer;
}
void init()
{
memset(d,-,sizeof(d));
}
int main()
{
// freopen("test.txt","r",stdin);
int t;
scanf("%d",&t);
int Case=;
while(t--)
{
scanf("%lld%lld",&n,&m);
init();
if(n>m)
swap(n,m);
printf("Case %d: %lld\n",++Case,f(m)-f(n-));
}
return ;
}

最新文章

  1. [SharePoint 2010] 自定义字段类型开发(二)
  2. LinearLayout的gravity属性以及其子元素的layout_gravity何时有效;RelativeLayout如何调整其子元素位置只能用子元素中的属性来控制,用RelativeLayout中的gravity无法控制!!!
  3. 5种IE hasLayoutt的属性及其值
  4. 使用spring框架中的组件发送邮件
  5. JavaSE语法基础(3)---函数、数组
  6. Ubuntu18.04教程
  7. Java Web解决跨域请求
  8. 一个简单的TensorFlow可视化MNIST数据集识别程序
  9. YARN集群的mapreduce测试(四)
  10. 新项目增加gradlew
  11. mkimage command not found – U-Boot images will not be built
  12. Dedecms5.7搜索结果页空白无内容的解决方法
  13. 在C#中理解和实现策略模式的绝对入门教程
  14. boost--signal
  15. C#访问MySQL数据库帮助类
  16. 安装Python3后,centos使用yum报错
  17. AjaxPro实现异步调用,解决浏览器假死及超时问题
  18. 本机号码认证黑科技:极光(JG)开发者服务推出“极光认证”新产品
  19. JZYZOJ1540 BZOJ4035 [ haoi2015 上午] T3 博弈论 sg函数 分块 haoi
  20. Autofac3 在MVC4中的运用原理

热门文章

  1. NOIP2014D2T2寻找道路(Spfa)
  2. [luoguP2982][USACO10FEB]慢下来Slowing down(dfs序 + 线段树)
  3. hdu3516 Tree Construction (四边形不等式)
  4. 【bzoj1042】[HAOI2008]硬币购物-递推与动规-容斥原理
  5. Pytho操作MySQL
  6. PLSQL安装资料
  7. DATASNAP清除僵死连接
  8. bug集合及其解决方法
  9. Vs2017添加引用时报错 未能正确加载“ReferenceManagerPackage”包。
  10. web前端开发 代码规范 及注意事项