SGU 390 Tickets(数位dp,较难)
来源:互联网 发布:开来软件 编辑:程序博客网 时间:2024/05/17 06:14
题目链接
SGU 390 Tickets
题意
有一位售票员给乘客售票。对于每位乘客,他会卖出多张连续的票,直到已卖出的票的 编号的数位之和不小于给定的正数
数据规模:
分析
这个题也挺难的。。。我觉得。
首先这个不能区间减法做了。我们需要在每一步时判断上下限。
把一个十进制数的区间看成一个十叉树,每个分支代表一个数字。用dp[pos][left][cur]
表示枚举到第
递归的终止
#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std;typedef long long ll;int K, n, m, digitL[20], digitR[20], vis[20][200][1010];ll L, R;pair<ll, int> dp[20][200][1010];pair<ll, int> dfs(int pos, int left, int cur, int limitL, int limitR){ if (pos == -1) { if (left + cur >= K) return make_pair(1, 0); else return make_pair(0, left + cur); } if (!limitL && !limitR && vis[pos][cur][left]) return dp[pos][cur][left]; int low = limitL ? digitL[pos] : 0; int high = limitR ? digitR[pos] : 9; pair<ll, int> ret = make_pair(0, left), tmp; for (int i = low; i <= high; ++i) { tmp = dfs(pos - 1, ret.second, cur + i, limitL && (i == low), limitR && (i == high)); ret.first += tmp.first, ret.second = tmp.second; } if (!limitL && !limitR) { vis[pos][cur][left] = 1; dp[pos][cur][left] = ret; } return ret;}int main(){ while (~scanf("%lld%lld%d", &L, &R, &K)) { memset(vis, 0, sizeof (vis)); memset(digitL, 0, sizeof (digitL)); memset(digitR, 0, sizeof (digitR)); n = m = 0; while(L) { digitL[n++] = L % 10; L /= 10; } while (R) { digitR[m++] = R % 10; R /= 10; } printf("%lld\n", dfs(m - 1, 0, 0, 1, 1).first); } return 0;}
0 0
- SGU 390 Tickets(数位dp,较难)
- SGU 390 Tickets(数位DP)
- SGU 390 Tickets (数位DP, k进制树)
- SGU 390 Tickets (数位dp,k进制树的合并)
- [SGU390]Tickets && 数位DP
- sgu 390 购票(上下界数位dp)
- SGU 492 经典数位dp
- URAL 1036 Lucky Tickets (高精度,数位dp)
- 【POJ】2346 - Lucky tickets(数位dp)
- 【数位DP】【SGU 258】. Almost Lucky Numbers
- hdu4507(数位dp,较复杂)
- 【数位DP】Codeforces Gym 100418J Lucky tickets
- Gym 100418J Lucky tickets(数位dp)
- POJ 2346 Lucky tickets(数位dp求前几位数字和)
- 较难DP(1227)
- SGU 365 Ships of the Desert 简单数位dp
- Tickets 【dp】
- 【数位统计】Tickets
- 颠覆你思维的静态加载顺序
- (超详细)Oracle 10g RAC 添加节点实验操作总结
- IE下支持文本框和密码框placeholder效果的JQuery插件分享
- Error mounting /dev/sda1 at /media/XXXX: Command-line `mount -t "ntfs" -o
- iOS swift3.0 抽屉式侧滑布局的实现
- SGU 390 Tickets(数位dp,较难)
- Python的build-in函数super()
- 我们应该如何去了解JavaScript引擎的工作原理
- (超详细)Oracle 10g RAC 删除节点实验操作总结
- socketpair
- oracle insert select from 导致ORA-04030
- 网络(3):epoll详解及注意事项
- c# log4net 日志输出到 本地文件 textbox listview DEMO
- Codeforces Round #369 (Div. 2) -- C. Coloring Trees (三维DP)