CodeForces - 204A Little Elephant and Interval

Posted on 2022-11-03 18:17  Capterlliar  阅读(17)  评论(0编辑  收藏  举报

题意:给定区间[l, r],问区间内有多少第一个数字和末尾数字一样的数。

解:练习一些数位dp。先从高到低dp[pos][fir]表示dp到第pos个位置,以fir开头的串的数量,其中fir不为0。这道题0055和55显然不同,有前导0的影响,因此再加一维[con],然后en往板子里套。

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxx 100005
#define maxn 25
#define maxm 205
#define ll long long
#define inf 1000000009
#define mod 1000000007
int a[20];
int len;
ll dp[20][10][2]={0};
ll dfs(ll pos,ll fir,ll pre,ll con,ll limit){
    if(pos==0) {
        return !con&&pre==fir;
    }
    if(!limit&&fir!=-1&&dp[pos][fir][con]!=-1)
        return dp[pos][fir][con];
    ll ret=0;
    ll res=limit?a[pos]:9;
    for(int i=0;i<=res;i++){
        if(con&&(i!=0)) fir=i;
        ret+= dfs(pos-1,fir,i,con&&(i==0),limit&&(a[pos]==i));
    }
    return !limit?dp[pos][fir][con]=ret:ret;
}
ll solve(ll x){
    len=0;
    while(x){
        a[++len]=x%10;
        x/=10;
    }
    return dfs(len,-1,0,1,1);
}
signed main() {
//    int T;
//    scanf("%d",&T);
//    while(T--) {;
//
//    }
    ll l,r;
    memset(dp,-1,sizeof dp);
    cin>>l>>r;
    cout<<solve(r)- solve(l-1)<<'\n';
    return 0;
}
View Code