思路:
数据不大,可以直接暴力。
这里给出数位dp的方法。
#include <bits/stdc++.h>
using namespace std;
int a[10],dp[10][10],len;//dp[数位][状态]
int dfs(int pos,int precnt,int limit)
{
if(pos>len)
return precnt;
if(!limit&&dp[pos][precnt]!=-1)//具有普遍性,返回记忆值
return dp[pos][precnt];
int sum=0;
int up = limit==1?a[pos]:9;
for(int i=0;i<=up;i++)
{
sum+=dfs(pos+1,precnt+(i==1),limit&&i==up);
}
if(!limit)//具有普遍性,记录值
dp[pos][precnt]=sum;
return sum;
}
int solve(string s)
{
len=s.size();
for(int i=1;i<=len;i++)
a[i]=s[i-1]-'0';
memset(dp,-1,sizeof(dp));
return dfs(0,0,1);
}
int main()
{
string s;
cin>>s;
cout<<solve(s);
return 0;
}