原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734
大致意思就是每次询问【0,b】区间有多少数的f(i) <= f(a)
这题有一个巧妙的状态定义方式:dp[pos][sum]表示枚举到第pos位,【还需要】sum才能达到f(a)
1e9的数据范围,sum不超过5000。最后只要sum >= 0就表示不超过f(a)
状态依旧与输入的a无关:如果a改变了,dfs传入的sum改变,而枚举pos位得到sum是数本身的性质,所以还是在开头memset
1 #include2 #include 3 #include 4 using namespace std; 5 6 int a[15], dp[15][5000]; 7 8 int f(int k){ 9 int ans = 0, pos = 0;10 while (k){11 ans += (k%10)*(1< = 0;20 if (sum < 0) return 0;21 if (!lim && dp[pos][sum] != -1) return dp[pos][sum];22 int ans = 0;23 int r = lim ? a[pos] : 9;24 for (int i = 0; i <= r; i++){25 ans += dfs(pos-1, sum - i*(1<