light oj 1205(数位DP)
题目描述:
求给定区间中的回文数有多少个?
首先明确一点,如果一个数是回文数,那么给这个数两边加上相同的数,那么这个数还是回文数。
根据这点就可以进行递推了,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 ;
}
light oj 1205(数位DP)的更多相关文章
- light oj 1032(数位DP)
求一段区间中,每个十进制数所对应的二进制数中连续的1的个数之和. 设dp[i][0]代表长度为i的二进制数,首位为0,所含有的连续的1的个数之和. dp[i][1]代表长度为i的二进制数,首位为1,所 ...
- light oj 1068 数位dp
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...
- light oj 1205 - Palindromic Numbers 数位DP
思路:搜索的时候是从高位到低位,所以一旦遇到非0数字,也就确定了数的长度,这样就知道回文串的中心点. 代码如下: #include<iostream> #include<cstdio ...
- Light oj 1030 概率DP
D - Discovering Gold Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:32768 ...
- lightoj 1205 数位dp
1205 - Palindromic Numbers PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...
- light oj 1422 区间dp
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...
- light oj 1084 线性dp
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...
- light 1205 - Palindromic Numbers(数位dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1205 题解:这题作为一个数位dp,是需要咚咚脑子想想的.这个数位dp方程可能不 ...
- light oj 1068 - Investigation 数位DP
思路:典型的数位DP!!! dp[i][j][k]:第i位,对mod取余为j,数字和对mod取余为k. 注意:由于32位数字和小于95,所以当k>=95时,结果肯定为0. 这样数组就可以开小点, ...
随机推荐
- Hotel(poj 3667)
题意:询问区间最长连续空串 /* 用线段树维护区间最长连续左空串和右空串 */ #include<cstdio> #include<iostream> #define N 50 ...
- Hankson 的趣味题(codevs 1172)
题目描述 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在 ...
- 【HDOJ6335】Nothing is Impossible(贪心)
题意: 有n道题目m个人,每道题目有1个正确选项和a[i]个错误选项,每个人每道题只能选一个选项 求出最坏情况下分数最多的人至少能拿到几分 n<=1e2,m<=1e9,1<=b[i] ...
- msp430项目编程24
msp430中项目---MMC接口 1.串行通信工作原理 2.串行通信协议 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- uva 662
dp +路径输出 #include <cstdio> #include <cstdlib> #include <cmath> #include <stack& ...
- Java函数式接口Consumer
Consumer是java8提供的函数式接口之一,意思为消费者,接受参数而不返回值 void accept(T t); default Consumer<T> andThen(Consum ...
- Java数组操作方法收集(快速判断某个值在这个数组中)
Java数组操作最高效的方式是循环取值,如果转换成集合那么就会分配内存,效率不如前者,但是方法多,需要在性能调优上去权衡.切记:数组是数组,集合是集合. 下面是收集最常用的数组转成集合的操作方法: i ...
- DATASNAP清除僵死连接
DATASNAP使用TCP/IP长连接的时候,由于诸如客户端非正常关闭的情况会造成中间件产生僵死SOCKET连接,随着时间的推移,僵死连接越来越多,造成中间件停止服务,表现为客户端无法连接中间件.DE ...
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- uva558 Wormholes SPFA 求是否存在负环
J - Wormholes Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...