51nod1009 数字1的数量
Posted wangyiming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod1009 数字1的数量相关的知识,希望对你有一定的参考价值。
思路:
数位dp。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 class Solution 4 5 public: 6 vector<int> preprocess(int x) 7 8 vector<int> res; 9 while (x) res.push_back(x % 10); x /= 10; 10 return res; 11 12 int dfs(vector<int>& a, int p, int cnt, bool u, vector<vector<int>>& dp) 13 14 if (p == -1) return cnt; 15 if (!u && dp[p][cnt] != -1) return dp[p][cnt]; 16 int res = 0; 17 int h = u ? a[p] : 9; 18 for (int i = 0; i <= h; i++) 19 20 res += dfs(a, p - 1, cnt + (i == 1), u && (i == h), dp); 21 22 return u ? res : dp[p][cnt] = res; 23 24 int NumberOf1Between1AndN_Solution(int n) 25 26 vector<int> a = preprocess(n); 27 int l = a.size(); 28 vector<vector<int>> dp(l, vector<int>(l + 1, -1)); 29 return dfs(a, l - 1, 0, true, dp); 30 31 ; 32 33 int main() 34 35 int n; 36 while (cin >> n) 37 38 cout << Solution().NumberOf1Between1AndN_Solution(n) << endl; 39 40 return 0; 41
以上是关于51nod1009 数字1的数量的主要内容,如果未能解决你的问题,请参考以下文章