HDU 3709 Balanced Number(数位dp)
2015-12-07 16:45
435 查看
题意:若某数,固定某位为支点,得到平衡的则称为平衡数。给定区间问有多少个。
思路:数位dp。
思路:数位dp。
#include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cstdio> #include <vector> #include <string> #include <queue> #include <stack> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define mem(a, n) memset(a, n, sizeof(a)) #define ALL(v) v.begin(), v.end() #define si(a) scanf("%d", &a) #define sii(a, b) scanf("%d%d", &a, &b) #define siii(a, b, c) scanf("%d%d%d", &a, &b, &c) #define pb push_back #define eps 1e-8 const int inf = 0x3f3f3f3f, N = 2e3 + 5, MOD = 1e9 + 7; int T, cas = 0; int n, m; LL l, r; int bit[20]; LL dp[20][20] ; LL dfs(int pos, int o, int l, bool flag) { if(pos == -1) return l == 0; if(l < 0) return 0; if(dp[pos][o][l] != -1 && !flag) return dp[pos][o][l]; LL ret = 0; int ed = flag ? bit[pos] : 9; for(int i = 0; i <= ed; i ++) { int nxt = l; nxt += (pos - o) * i; ret += dfs(pos - 1, o, nxt, flag && i == ed); } if(!flag) dp[pos][o][l] = ret; return ret; } LL cal(LL x) { int len = 0; while(x) { bit[len ++] = x % 10; x /= 10; } LL ret = 0; for(int i = 0; i < len; i ++) ret += dfs(len - 1, i, 0, 1); return ret - (len - 1); } int main(){ #ifdef LOCAL freopen("/Users/apple/input.txt", "r", stdin); // freopen("/Users/apple/out.txt", "w", stdout); #endif si(T); mem(dp, -1); while(T --) { scanf("%lld%lld", &l, &r); printf("%lld\n", cal(r) - cal(l - 1)); } return 0; }
相关文章推荐
- 剑指offer系列之十六:树的子结构
- ILMerge的使用方法
- Gstreamer基本概念介绍(开发前必读)
- 普法知识(22):受到开除处分能否官复原职?
- 使用Flurry来统计和分析用户行为
- 第十四周 项目1 验证算法(3)
- 模版模式
- 第15周 项目2-用哈希法组织关键字
- php安装扩展
- 敏捷团队中测试人员的角色
- 【python】函数名存在变量中
- 第14周项目2 二叉树排序树中查找的路径
- 【第14周 项目2 - 二叉树排序树中查找的路径】
- 工作流学习(二)
- 第十五周实践项目一---哈希表及其运算的实现
- 第15周 项目2-哈希法组织关键字 链地址法
- 第十五周项目2-用哈希法组织关键字
- NCURSES的安装学习
- java基础-generics 泛型
- js跨域请求页面的时候如果不做处理会报错