hdu 5898 odd-even number (数位dp 沈阳网络赛)

本文介绍了一种使用数位动态规划(数位DP)解决特定类型数学问题的方法。通过实例解析,展示了如何求解在指定范围内,符合特定奇偶序列规律的整数数量。代码实现清晰地解释了算法思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5898
题意:

求l到r的数里面,有多少数符合奇数连续的数位长度是偶数,偶数连续的数位长度是奇数。

分析:

裸的数位dp

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=30;
typedef unsigned long long ll;
ll f[N][2][N];
// 数位、奇偶、长度
int bit[N];
//位置,前导是0,奇偶,奇偶的长度,当前序列是否符合条件,最大范围
ll dfs(int pos,int pre,int x,int length,int ok,bool lim) {
    if(pre&&!ok)return 0;
    if(pos==0)return (length+x)%2;

    if(!lim&&f[pos][x][length]!=-1)return f[pos][x][length];
    int num=lim?bit[pos]:9;
    ll ans=0;
    for(int i=0; i<=num; i++) {
        if(pre==0&&i==0)ans+=dfs(pos-1,0,0,0,1,0);
        else {
            if(pre==0)
                ans+=dfs(pos-1,1,i%2,1,1,lim&&(i==num));
            else {
                if(i%2==x)ans+=dfs(pos-1,1,x,length+1,ok ,lim&&(i==num));
                else ans+=dfs(pos-1,1,!x,1,ok&&(length+x)%2,lim&&(i==num));
            }
        }
    }
    if(!lim)f[pos][x][length]=ans;
    return ans;
}
ll solve(ll a) {
    int pos=0;
    while(a) {
        bit[++pos]=a%10;
        a/=10;
    }
    return dfs(pos,0,0,0,0,1);
}
int main() {
    //freopen("f.txt","r",stdin);
    int T;
    scanf("%d",&T);
    ll a,b;
    int cas=0;
    memset(f,-1,sizeof(f));
    while(T--) {
        scanf("%lld%lld",&a,&b);
        printf("Case #%d: %lld\n",++cas,solve(b)-solve(a-1));
    }
    return 0;
}
/*
Sample Input
2    
1 100    
110 220 

Sample Output
Case #1: 29
Case #2: 36
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值