题意:给定区间[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
标签:fir,Little,ll,pos,CodeForces,Elephant,con,dp,define From: https://www.cnblogs.com/capterlliar/p/16855427.html