1 int dp[11][11];
2 int a[11];
3
4 class Solution {
5 public:
6 long long dfs(int eq,int dep,int sum)
7 {
8 if(!dep)return sum;
9 if(~dp[dep][sum]&&!eq)return dp[dep][sum];
10 int mx=eq==1?a[dep]:9;
11 long long ret=0;
12 for(int i=0;i<=mx;i++)
13 {
14 ret+=dfs((i==mx)&&eq,dep-1,(sum+((i==1)?1:0)));
15 }
16 if(!eq)dp[dep][sum]=ret;
17 return ret;
18 }
19 long long work(int n)
20 {
21 int tot=0;
22 memset(dp,-1,sizeof(dp));
23 for(;n;n/=10)a[++tot]=n%10;
24 return dfs(1,tot,0);
25 }
26 int countDigitOne(int n) {
27 return work(n);
28 }
29 };