您的位置:首页 > 其它

HDU 5898 odd-even number (数位DP)

2017-08-29 19:42 337 查看
题意:

求l~r 连续的奇数个数有偶数个,连续偶数的个数有奇数个 的 数字个数

#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;
ll dp[20][5];
int digit[20];
/// 0 前导0
/// 1 奇数的个数有奇数个
/// 2 奇数的个数有偶数个
/// 3 偶数的个数有奇数个
/// 4 偶数的个数有偶数个
ll dfs(int len,int limit,int status)
{
if(len<0)
{
if(status==2||status==3)
return 1;
return 0;
}
if(!limit&&dp[len][status]!=-1)
return dp[len][status];
int last;
if(limit) last=digit[len];
else last=9;
ll ans=0;
for(int i=0;i<=last;i++)
{
if(status==0)
{
if(i==0) ans+=dfs(len-1,0,0);
else
{
if(i&1)
ans+=dfs(len-1,limit&&i==last,1);
else
ans+=dfs(len-1,limit&&i==last,3);
}
}
else if(status==1)
{
if(i%2)
ans+=dfs(len-1,limit&&i==last,2);
}
else if(status==2)
{
if(i%2==0)
ans+=dfs(len-1,limit&&i==last,3);
else ans+=dfs(len-1,limit&&i==last,1);
}
else if(status==3)
{
if(i%2==0)
ans+=dfs(len-1,limit&&i==last,4);
else ans+=dfs(len-1,limit&&i==last,1);
}
else if(status==4)
{
if(i%2==0) ans+=dfs(len-1,limit&&i==last,3);
}
}
if(!limit)
dp[len][status] = ans;
return ans;

}
ll solve(ll x)
{
memset(dp,-1,sizeof(dp));
int cnt=0;
while(x!=0)
{
digit[cnt++]=x%10;
x/=10;
}
return dfs( cnt-1, 1, 0 ) ;
}

int main()
{
int t;
scanf("%d",&t);
for(int cs=1;cs<=t;cs++)
{
ll l,r;

scanf("%lld%lld",&l,&r);
printf("Case #%d: ",cs);
printf("%lld\n",solve(r)-solve(l-1));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: