X - Mountain Number
要求出区间内偶数为大于奇数位的数字的个数
dp[i][j][k] 表示在第i个位置时,前面是j,现在这位是奇数位还是偶数位的数目
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int t;
int bit[25],l,r;
int dp[20][10][2];
int dfs(int pos,int pre,int odd,int lead,int limit)
{
if(pos==-1) return 1;
if(dp[pos][pre][odd]!=-1 && !limit)
return dp[pos][pre][odd];
int up=limit?bit[pos]:9;
int ans = 0;
for(int i=0;i<=up;i++)
{
if(!(i||lead))
ans+=dfs(pos-1,9,0,lead||i,limit&&i==up);
else if(odd && pre<=i)
ans+=dfs(pos-1,i,!odd,lead||i,limit&&i==up);
else if(!odd && pre>=i)
ans+=dfs(pos-1,i,!odd,lead||i,limit&&i==up);
}
if(!limit)
dp[pos][pre][odd] = ans;
return ans;
}
int cal(int x)
{
int len = 0;
while(x)
{
bit[len++] = x%10;
x/=10;
}
return dfs(len-1,9,0,0,1);
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(dp,-1,sizeof(dp));
scanf("%d%d",&l,&r);
printf("%d\n",cal(r)-cal(l-1));
}
return 0;
}