题意:求满足奇数位的数大于与它相邻的偶数位上的数,求[L,R]之间有多少个
思路:考虑首位与不考虑首位是不同的,这是关键啊,然后逐位考虑每一位上的数,记忆化搜索
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 20;
int dp[MAXN][MAXN][2],num[MAXN],len;
int dfs(int pos,int pre,int odd,bool sgn){
if (pos == -1)
return 1;
if (!sgn && ~dp[pos][pre][odd])
return dp[pos][pre][odd];
int ret = 0;
int end = sgn ? num[pos] : 9;
for (int i = 0; i <= end; i++){
if (odd && i >= pre)
ret += dfs(pos-1,i,odd^1,sgn && i == end);
else if (!odd && i <= pre)
ret += dfs(pos-1,i,odd^1,sgn && i == end);
}
if (!sgn)
dp[pos][pre][odd] = ret;
return ret;
}
int solve(int n){
if (n < 0)
return 0;
if (n == 0)
return 1;
len = 0;
while (n){
num[len++] = n % 10;
n /= 10;
}
return dfs(len-1,10,0,1);
}
int main(){
int t;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
while (t--){
int l,r;
scanf("%d%d",&l,&r);
int ans = solve(r) - solve(l-1);
printf("%d\n",ans);
}
return 0;
}