# Acwing 1082 数字游戏[数位dp]

Acwing 1082 数字游戏[数位dp]

题意

求[X,Y]中的数,满足数字从左到右非下降关系的数的个数,如:123,445.

思路

数位dp经典题。

f[i][j]表示有i位,并且最高位是j的方案总数。

对于某一位,先枚举该位取 [ 0 a n 1 1 ] [0 \sim a_{n-1}-1] 的取法,可以直接算出来,再考虑该位取 a n 1 a_{n-1} 的做法。
在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=35;
int f[maxn][maxn];
inline void init(){
    for(int i=0;i<=9;i++)f[1][i]=1;

    for(int i=2;i<=maxn;i++)
        for(int j=0;j<=9;j++)
            for(int k=j;k<=9;k++)
                f[i][j]+=f[i-1][k];
}
inline int dp(int n){
    if(!n)return 1;
    int res=0,last=0;

    vector<int> v;
    while(n)v.push_back(n%10),n/=10;

    for(int i=v.size()-1;i>=0;i--){
        int x=v[i];

        for(int j=last;j<x;j++)res+=f[i+1][j];//这里i+1是因为i是从0开始,比位数小1

        if(x<last)break;
        last=x;
        if(!i)res++;
    }
    return res;
}
int main(){
    init();
    int a,b;
    while(cin>>a>>b)cout<<dp(b)-dp(a-1)<<endl;
    return 0;
}
发布了8 篇原创文章 · 获赞 0 · 访问量 176

猜你喜欢

转载自blog.csdn.net/sstealer/article/details/104569688
今日推荐