x=a[0]a[1]...a[len-2]a[len-1],所有下标为奇数的数都>=他左右的数的称为Mountain Number ,找L~R中Mountain Number的个数
思路:数位dp,dp[i][j][k],i表示第i位,j表示奇数位还是偶数位,k表示前一位的数
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[20];
long long dp[20][20][2];
int len;
long long dfs(int len1,int tmp,int state,int limit)
{
if(len1<0)
return 1;
if(!limit&&dp[len1][state][tmp]!=-1)
return dp[len1][state][tmp];
int fp=limit?num[len1]:9;
long long ret=0;
for(int i=0;i<=fp;i++)
{
if(!tmp&&i<=state)
ret+=dfs(len1-1,1,i,limit&&i==fp);
if(tmp&&i>=state)
ret+=dfs(len1-1,0,i,limit&&i==fp);
}
if(!limit)
dp[len1][state][tmp]=ret;
return ret;
}
long long get_num(long long x)
{
len=0;
while(x)
{
num[len++]=x%10;
x=x/10;
}
return dfs(len-1,0,10,1);
}
int main()
{
int n,m,t;
memset(dp,-1,sizeof(dp));
cin>>t;
while(t--)
{
cin>>n>>m;
long long ans=get_num(m)-get_num(n-1);
cout<<ans<<endl;
}
return 0;
}