题意:
找里有多少个数包含了.
思路:
典型的特定数字问题,数位入门题。
,表示第位,当前位是不是,是否出现了.
刚开始没有加第三维,一直对不上案例,后面发现只有两维的保存的结果不一定能通用,比如:
前两个可以是同一个结果,但第三个和前两个不一样,可以任意取。
Code:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e3+7; inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } ll dp[20][2][2]; int digit[20]; ll dfs(int len,int pos,bool tot,bool limit,int sum) { if(!len) return tot; if(!limit&&dp[len][pos==4][tot]!=-1) return dp[len][pos==4][tot]; int endi=(limit?digit[len]:9); ll ans=0; for(int i=0;i<=endi;++i) { ans+=dfs(len-1,i,tot||pos==4&&i==9,limit&&i==endi,sum*10+i); } if(!limit) dp[len][pos==4][tot]=ans; return ans; } ll solve(ll n) { int len=0; while(n) { digit[++len]=n%10; n/=10; } return dfs(len,0,false,true,0); } int main() { int t=read(); memset(dp,-1,sizeof dp); ll n; while(t--) { n=read(); printf("%lld\n",solve(n)); } return 0; }