51nod 1042 数字0-9的数量(数位dp)
2017-05-14 19:46
274 查看
做法同51nod 1009 数字1的数量 相差不多,不过查询0的时候要特别处理,做的时候拿别人代码调了好久才看懂。。。参考的:http://blog.csdn.net/f_zyj/article/details/52082449
#include <iostream> #include <algorithm> using namespace std; typedef long long ll; ll dp[20]; void init() { //如果算前导0,0-9都是一样的次数,,不过不算前导0,所以后边0要单独处理 for(int i = 1; i <= 18; ++i) dp[i] = dp[i-1]*10 + pow(10,i-1); } ll solve(ll num, ll aim) { ll len = 0; ll ten = 1; ll res = 0; ll tail = 0; ll temp = num; ll cur; while(temp) { cur = temp%10; temp /= 10; ++len; if(cur > aim) { //cur*dp[len-1]是当前位低一位为aim的情况,ten是当前位为aim的情况 res = res + cur*dp[len-1] + ten; } else if(cur == aim) { //因为cur==aim,所以不能直接加ten,所以要加tail,例如aim=1,这就是101~到1xx的百位为aim的情况,+1是指100 res = res + dp[len-1] + 1 + tail; } else { //这里同cur > aim差不多,只是没有当前位为aim的情况 res = res + cur*dp[len-1]; } //现在记录的tail就是下一轮循环中当cur==aim时的aim000-aimxxx的最高位为aim的情况 tail = tail + cur*ten; ten *= 10; } //处理0 if(!aim) { ll cnt = 1; while(num) { res -= cnt; cnt *= 10; num /= 10; } } return res; } int main() { init(); ios::sync_with_stdio(false); ll a,b; cin >> a >> b; for(int i = 0; i < 10; ++i) { cout << solve(b,i) - solve(a-1,i) << endl; } return 0; }
相关文章推荐
- 51nod 1042 数字0-9的数量 数位DP
- 51nod 1042 数字0-9的数量【数位dp】
- 【51Nod】1042 - 数字0-9的数量(数位dp & 递归)
- 51Nod 1042 数字0-9的数量 (数位DP
- 51Nod 1042 数字0-9的数量 (数位DP
- 51nod 1042 数字0-9的数量 数位DP
- 51nod 1042 数字0-9的数量(数位DP)
- 51nod 1042 数字0-9的数量 数位dp
- 51nod 1042 数字0-9的数量(数位dp)
- 51nod 1009 数字1的数量(数位dp)
- 【51nod 1009】数字1的数量 【数位DP 模板】
- 51Nod 1009 数字1的数量(数位dp)
- 51nod 1009 数字1的数量 数位dp
- 51nod 1009 数字1的数量【数位dp】
- 51nod数字0-9的数量(数位dp)
- 51Nod 数字0到9的数量 (数位DP)
- 1042 数字0-9的数量(数位DP)
- 51nod 1009 数字1的数量(数位dp)
- 【数位dp入门】51nod 1009 数字1的数量
- 51nod 数字1的数量(数位DP)