hdu5898
题目
求范围内连续奇数个数是偶数,连续偶数个数是奇数的数的个数。
思路
灵性队友
http://blog.csdn.net/qq_34872380/article/details/52588809
dp[len][pre][e] 代表第几位,之前一位是奇数还是偶数,e表示是否还要添加一个与pre同为奇数或者偶数的数。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long int dp[20][2][2];
int a[20];
long long int dfs(int len,int pre,int e,bool flag,bool s)
{
if(len<0)
{
return e==1?0:1;
}
if(flag==false&&dp[len][pre][e]!=-1&&s)
{
return dp[len][pre][e];
}
long long int ans=0;
int cnt=flag?a[len]:9;
for(int i=0; i<=cnt; i++)
{
if(s==false)
{
if(i==0)
ans+=dfs(len-1,0,0,flag&&i==cnt,false);
else
{
ans+=dfs(len-1,i%2,i%2==1?1:0,flag&&i==cnt,true);
}
}
else if(i%2==1)
{
if(pre%2==1)
ans+= dfs(len-1,1,e^1,flag&&i==cnt,true);
else
{
if(e==0)
{
ans+= dfs(len-1,1,1,flag&&i==cnt,true);
}
}
}
else
{
if(pre%2==0)
ans+=dfs(len-1,0,e^1,flag&&i==cnt,true);
else
{
if(e==0)
{
ans+=dfs(len-1,0,0,flag&&i==cnt,true);
}
}
}
}
if(!flag&&s)
dp[len][pre][e]=ans;
return ans;
}
long long int solve(long long int x)
{
int len=0;
memset(a,0,sizeof(0));
while(x>0)
{
a[len++]=x%10;
x/=10;
}
return dfs(len-1,0,0,true,false);
}
int main()
{
int t,ca=1;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
while(t--)
{
long long int l,r;
scanf("%I64d%I64d",&l,&r);
printf("Case #%d: %I64d\n",ca++,solve(r)-solve(l-1));
}
return 0;
}