数位dp

刚写了两个数位dp的入门题: bomb和不要62
两个题都可以在各个评测网站上找到
直接贴代码了

bomb

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int a[20];
ll dp[20][2];

ll dfs(int len,bool judge4,bool limit)
{
    if(len==0)
        return 1;
    if(!limit&&dp[len][judge4])
        return dp[len][judge4];

    ll cnt=0,up=(limit? a[len] : 9);

    for(int i=0;i<=up;++i){
        if(judge4&&i==9)
            continue;
        cnt+=dfs(len-1,i==4,limit&&i==up);
    }
    if(!limit)
        dp[len][judge4]=cnt;
    return cnt;
}

ll solve(ll num)
{
    int k=0;
    while(num){
        a[++k]=num%10;
        num/=10;
    }
    return dfs(k,false,true);
}

int main()
{
    int t;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        cout<<n+1-solve(n)<<endl;
    }
    return 0;
}

不要62

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int a[20];
ll dp[20][2];

ll dfs(int len,bool judge6,bool limit)
{
    if(len==0)
        return 1;
    if(!limit&&dp[len][judge6])
        return dp[len][judge6];

    ll cnt=0,up=(limit? a[len] : 9);

    for(int i=0;i<=up;++i){
        if(judge6&&i==2||i==4)
            continue;
        cnt+=dfs(len-1,i==6,limit&&i==up);
    }
    if(!limit)
        dp[len][judge6]=cnt;
    return cnt;
}

ll solve(ll num)
{
    int k=0;
    while(num){
        a[++k]=num%10;
        num/=10;
    }
    return dfs(k,false,true);
}

int main()
{
    int n,m;
    while(cin>>n>>m&&(n+m)){
        cout<<solve(m)-solve(n-1)<<endl;
    }
    return 0;
}

两个题都是打板子的题,等会写一下windy数发上来
数位dp如果不太好理解可以找个视频看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值