题意: 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。 数据范围: 1 <= n < 2^31 解法: 令d[i][j]表示剩余长度为len,高位有cnt个1的方案数. 数位dp一下就行了. code: class Solution { public: int d[22][22]; int dis[22]; int dfs(int len,int limit,int cnt){ if(!len)return cnt; if(!limit&&~d[len][cnt])return d[len][cnt]; int ma=(limit?dis[len]:9); int ans=0; for(int i=0;i<=ma;i++){ ans+=dfs(len-1,limit&&i==ma,cnt+(i==1)); } if(!limit)d[len][cnt]=ans; return ans; } int solve(int x){ int len=0; while(x){ dis[++len]=x%10; x/=10; } return dfs(len,1,0); } int countDigitOne(int n) { memset(d,-1,sizeof d); int ans=solve(n); return ans; } };