CF1277A. Happy Birthday, Polycarp! 题解 枚举/数位DP
题目链接:http://codeforces.com/contest/1277/problem/A
题目大意:
求区间 \([1,n]\) 范围内有多少只包含一个数字的数。
比如:\(1,77,777,44,999999\) 都是只包含一个数字的数,而 \(12,11110,6969,987654321\) 这些不是。
解题思路:
本题可以采用枚举和数位DP解法来解决(当然,数位DP相对来说有些杀鸡用牛刀的感觉)。
枚举解法
首先,我们要确定,去除 \(0\) 以外,一个 \(i\) 位数最多有 \(9\) 个这样的数:
- \(1\)位数中总共有 \(9\) 个符合要求的数:\(1,2,3,4,5,6,7,8,9\);
- \(2\)位数中总共有 \(9\) 个符合要求的数:\(11,22,33,44,55,66,77,88,99\);
- \(3\)位数中总共有 \(9\) 个符合要求的数:\(111,222,333,444,555,666,777,888,999\);
- ……
因为告诉我们 \(1 \le n \le 10^9\) ,所以我们最多考虑 \(9\) 位数即可。
也就是说,所有满足要求的数只有 \(9 \times 9 = 81\) 个,我们只需要枚举这 \(81\) 个数,然后判断有多少个 \(\le n\) 即可。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int T, n;
int solve() {
int cnt = 0;
for (int i = 1; i <= 9; i ++) {
int s = 0;
for (int j = 0; j < 9; j ++) {
s = s * 10 + i;
if (s > n) break;
cnt ++;
}
}
return cnt;
}
int main() {
cin >> T;
while (T --) {
cin >> n;
cout << solve() << endl;
}
return 0;
}
数位DP解法
我们定义状态 \(f[pos][pre]\) 表示当
- 点前所在的数位为第 \(pos\) 位,
- 前一位放置的元素是 \(pre\)(如果前一位没有放置任何元素则 \(pre=0\))
时的方案总数。
并且开函数 dfs(int pos, int pre, bool limit) 用于求解:
- 点前所在的数位为第 \(pos\) 位;
- 前一位放置的元素是 \(pre\)(如果前一位没有放置任何元素则 \(pre=0\));
- \(limit\) 用于表示当前是否处于闲置转态
时的方案总数。
但是最终答案因为包含 \(0\) 这个方案,所以要减去 \(1\) 。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int f[11][11], T, n, a[11];
void init() {
memset(f, -1, sizeof(f));
}
int dfs(int pos, int pre, bool limit) {
if (pos < 0) return 1;
if (!limit && f[pos][pre] != -1) return f[pos][pre];
int up = limit ? a[pos] : 9;
int tmp = 0;
for (int i = 0; i <= up; i ++) {
if (pre == 0) {
if (i == 0) tmp += dfs(pos-1, i, limit && i==up);
else tmp += dfs(pos-1, i, limit && i==up);
}
else if (i == pre) tmp += dfs(pos-1, i, limit && i==up);
}
if (!limit) f[pos][pre] = tmp;
return tmp;
}
int get_num(int x) {
int pos = 0;
while (x) {
a[pos++] = x%10;
x /= 10;
}
return dfs(pos-1, 0, true);
}
int main() {
init();
cin >> T;
while (T --) {
cin >> n;
cout << get_num(n)-1 << endl;
}
return 0;
}
CF1277A. Happy Birthday, Polycarp! 题解 枚举/数位DP的更多相关文章
- 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)
ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...
- BZOJ 1799 - [AHOI2009]self 同类分布 - 枚举 数位DP
Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code #include<cstd ...
- 【AHOI2009】同类分布 题解(数位DP)
题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$p ...
- 2019-2020 ICPC Asia Hong Kong Regional Contest J. Junior Mathematician 题解(数位dp)
题目链接 题目大意 要你在[l,r]中找到有多少个数满足\(x\equiv f(x)(mod\; m)\) \(f(x)=\sum_{i=1}^{k-1} \sum_{j=i+1}^{k}d(x,i) ...
- P2188 小Z的 k 紧凑数 题解(数位DP)
题目链接 小Z的 k 紧凑数 解题思路 数位DP,把每一个数位的每一个数对应的可能性表示出来,然后求\(num(1,r)-num(1,l-1)\),其中\(num(i,j)\)表示\([i,j]\)区 ...
- Codeforces 834E The Bakery【枚举+数位dp】
E. Ever-Hungry Krakozyabra time limit per test:1 second memory limit per test:256 megabytes input:st ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 5787 K-wolf Number (数位DP)
K-wolf Number 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5787 Description Alice thinks an integ ...
- bzoj 3131 [Sdoi2013]淘金(数位dp)
题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...
随机推荐
- @codeforces - 631E@ Product Sum
目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 给定一个序列 a,定义它的权值 \(c = \sum_{i=1}^{ ...
- react 问题记录
1.控制台报错: Uncaught Error: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be add ...
- 实验4 JavaBean创建和使用(计算器)
实验4 JavaBean创建和使用 一.实验目的 1.掌握JavaBean创建和使用方法: 2.领会JavaBean简化页面设计的优势等. 二.实验内容 1.设计诸如以下页面的简单计算器 要求:完成 ...
- input标签前台实现文件上传
值得注意的是:当一个表单里面包含这个上传元素的时候,表单的enctype必须指定为multipart/form-data,method必须指定为post,浏览器才会认识并正确执行.但是还有一点,浏览器 ...
- 2012.2.1datagridview用法小结
dgv1.RowHeadersVisible = false; //最左侧栏消失 dgv1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode. ...
- MVC4 变更模板
模板位置: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4 ...
- pytorch JIT浅解析
概要 Torch Script中的核心数据结构是ScriptModule. 它是Torch的nn.Module的类似物,代表整个模型作为子模块树. 与普通模块一样,ScriptModule中的每个单 ...
- 2013年NOIP普及组复赛题解
题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...
- HTML提供的6种空格
HTML提供了6种空格(space entity),它们拥有不同的宽度. 非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其它几种空格( . . ..)在不同浏览器中宽度各异. ...
- 【t013】无聊的军官
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 每个学年的开始,高一新生们都要进行传统的军训.今年有一个军训教官十分奇怪,他为了测试学员们的反应能力,每 ...