codeforces 204A 数位DP

codeforces 204A


题意:

[ l , r ] 给定区间[l,r],限制条件:

  • 第一位数与最后一位数相等

问区间内满足以上条件的数的个数。


题解:

d p [ p o s ] [ s t ] p o s s t dp[pos][st]表示查到到第pos位,第一位数为st的合法数的个数。

  • d f s ( p o s 1 , ( l e a d = = 0 ) & & ( i ! = 0 ) ? i : s t , p o s = = 1 ? i : e d , l e a d i , l i m i t & & i = = b i t [ p o s ] ) 记忆化搜索,dfs(pos-1, (lead == 0) \&\& (i != 0) ? i : st, pos == 1 ? i : ed, lead || i, limit \&\& i == bit[pos])

#include <bits\stdc++.h>
using namespace std;
typedef long long ll;
int bit[20];
ll dp[20][10];

ll dfs(int pos, int st, int ed, bool lead, bool limit){
    if(pos == 0){
        return st == ed;
    }
    if(!limit && dp[pos][st] != -1){
        return dp[pos][st];
    }
    int up = (limit ? bit[pos] : 9);
    ll res = 0;
    for(int i = 0 ; i <= up ; i++){
        res += dfs(pos-1, (lead == 0) && (i != 0) ? i : st, pos == 1 ? i : ed, lead || i, limit && i == bit[pos]);
    }
    if(!limit){
        dp[pos][st] = res;
    }
    return res;
}

ll count(ll x){
    if(x == 0){
        return 1;
    }
    int len = 0;
    while(x){
        bit[++len] = x%10;
        x /= 10;
    }
    return dfs(len, 0, -1, false, true);
}

int main() {
    memset(dp, -1, sizeof(dp));
    ll l, r;
    cin >> l >> r;
    cout << count(r)-count(l-1) << endl;
    return 0; 
}

猜你喜欢

转载自blog.csdn.net/CSDN_PatrickStar/article/details/89843013
今日推荐