题意:
给出一个范围[L,R] 要求这个范围内满足第一位和最后一位相等的数的个数。
题解:
数位dp搞定,状态dp[pos][num]表示位数pos,第一位为num时满足条件个数。
这里有一个处理头的技巧,就是通过前导零来判断第一位,不然会误判,一开始就误判了没出结果,改下1a。
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<map>
using namespace std;
typedef __int64 lld;
const int oo=0x3f3f3f3f;
const lld OO=1e18;
const int Mod=1e8;
const int maxn=3000+5;
lld dp[20][11];
int bit[20],len;
lld dfs(int pos,int s,int e,int f,int pre0)
{
if(pos<1) return s==e;
if(!f&&dp[pos][s]!=-1) return dp[pos][s];
int last=f?bit[pos]:9;
lld res=0;
for(int i=0;i<=last;i++)
{
int a=s,b=e;
if(pre0==0&i!=0)
a=i;
if(pos==1)
b=i;
res+=dfs(pos-1,a,b,f&&i==last,pre0||i);
}
if(!f) dp[pos][s]=res;
return res;
}
lld Count(lld n)
{
if(n==0)
return 1;
len=0;
while(n)
{
bit[++len]=n%10;
n/=10;
}
return dfs(len,0,-1,1,0);
}
int main()
{
lld l,r;
memset(dp,-1,sizeof dp);
while(scanf("%I64d %I64d",&l,&r)!=EOF)
{
//printf("%I64d %I64d\n",Count(r),Count(l-1));
printf("%I64d\n",Count(r)-Count(l-1));
}
return 0;
}
/**
*/