HDU 5898 odd-even number (2016亚洲区沈阳站网络赛 )

来源:互联网 发布:淘宝网水晶家纺被子 编辑:程序博客网 时间:2024/05/16 10:06

第三次载在数位dp上。。。。
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898

#include <cstdio>#include <cstring>#include <cmath>#include <ctime>#include <cstdlib>#include <queue>#include <stack>#include <string>#include <map>#include <vector>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int N=1e6+2;int s,n,m,k,p,q,t,r,y,x,u,v;int a[N],b[N];long long dp[25][25][2][2];//u记录第几位,l记录目前的段的长度,v记录之前一个位是奇偶,o判断前导零long long dfs(int u, int v, int l, int o, bool f){    if(u <= 0)        return (v & 1) != (l & 1);    if(f && dp[u][l][v][o] != -1)        return dp[u][l][v][o];    int d = f ? 9 : a[u];    long long ans = 0;    for(int i = 0; i <= d; i++)    {        if(o == 0)   //如果前面都是0,记得特殊考虑这种情况        {            if(i == 0)                ans += dfs(u - 1, 0, 0, 0, f || i < d);            else                ans += dfs(u - 1, i & 1, 1, 1, f || i < d);        }        else        {            if(i & 1)            {                if(v & 1)                    ans += dfs(u - 1, i & 1, l + 1, 1, f || i < d);                else                {                    if(l & 1)                        ans += dfs(u - 1, i & 1, 1, 1, f || i < d);                }            }            else            {                if(v & 1)                {                    if(!(l & 1))                        ans += dfs(u - 1, i & 1, 1, 1, f || i < d);                }                else                {                    ans += dfs(u - 1, i & 1, l + 1, 1, f || i < d);                }            }        }    }    if(f) dp[u][l][v][o] = ans;    return ans;}long long solve(long long x){    int l = 0;    while(x)    {        a[++l] = x % 10;        x /= 10;    }    return dfs(l, 0, 0, 0, 0);}int main(){    int t;    scanf("%d", &t);    for(int i = 1; i <= t; i++)    {        memset(dp, -1, sizeof(dp));        long long l, r;        scanf("%I64d%I64d", &l, &r);        printf("Case #%d: %I64d\n", i, solve(r) - solve(l - 1));    }    return 0;}
0 0