CodeForces - 204A Little Elephant and Interval

Posted on   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
复制代码

 

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示