比赛的时候虽然有说要用数位DP,但是看了看还是没有什么具体的思路,之后看到大神的思路觉得很腻害……
代码在这;
#include <iostream>
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std;
LL dp[25][5];
int num[25];
LL dfs(int pos,int lit,int sts)
{
if(pos<1)
{
if(sts==2||sts==3) return 1;
else return 0;
}
if(!lit&&dp[pos][sts]!=-1)
return dp[pos][sts];
int end=lit?num[pos]:9;
LL ans=0;
for(int j=0;j<=end;++j)
{
if(!sts)
{
if(!j) ans+=dfs(pos-1,0,0);
else if(j&1) ans+=dfs(pos-1,lit&&j==end,1);
else ans+=dfs(pos-1,lit&&j==end,3);
}
else
{
if(sts==1)
{
if(j&1) ans+=dfs(pos-1,lit&&j==end,2);
}
else if(sts==2)
{
if(j&1) ans+=dfs(pos-1,lit&&j==end,1);
else ans+=dfs(pos-1,lit&&j==end,3);
}
else if(sts==3)
{
if(j&1) ans+=dfs(pos-1,lit&&j==end,1);
else ans+=dfs(pos-1,lit&&j==end,4);
}
else
{
if(!(j&1)) ans+=dfs(pos-1,lit&&j==end,3);
}
}
}
dp[pos][sts]=ans;
return ans;
}
LL solve(LL x)
{
memset(dp,-1,sizeof(dp));
int len=0;
while(x)
{
num[++len]=x%10;
x/=10;
}
return dfs(len,1,0);
}
int main()
{
int t;
LL l,r;
scanf("%d",&t);
for(int i=1;i<=t;++i)
{
scanf("%lld%lld",&l,&r);
printf("Case #%d: %lld\n",i,solve(r)-solve(l-1));
}
return 0;
}