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块. 一阵风吹过,金子的位置发生了 ...
随机推荐
- @loj - 2483@「CEOI2017」Building Bridges
目录 @desription@ @solution@ @accepted code@ @details@ @another solution@ @another code@ @desription@ ...
- python基础之逻辑题(1)
python基础之逻辑题(1) 1.用一行代码实现数值交换? 2.求结果--fromkeys? 3.1,2,3,4,5能组成多少个互不相同且无重复的三位数? 4.有两个字符串列表a和b,每个字符串是逗 ...
- 第三期 预测——Frenet 坐标
Frenet坐标 在讨论过程模型之前,我们应该提到“Frenet Coordinates”,它是一种以比传统x,y笛卡尔坐标更直观的方式表示道路位置的方式. 用Frenet坐标,我们使用变量 s和d描 ...
- PHP 试题(1)
1.__FILE__表示什么意思?(5分)文件的完整路径和文件名.如果用在包含文件中,则返回包含文件名.自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一 ...
- Spring < context:annotation-config> 、< context:component-scan>、< mvc:annotation-driven />注解配置
Spring 中在使用注解(Annotation)会涉及到< context:annotation-config> 和 < context:component-scan>配置, ...
- 2018-2-13-win10-uwp-ContentDialog-点确定不关闭
title author date CreateTime categories win10 uwp ContentDialog 点确定不关闭 lindexi 2018-2-13 17:23:3 +08 ...
- H3C 多路径网络中环路产生过程(3)
- 获取 Nuget 版本号
本文告诉大家通过命令行获取 Nuget 的版本号 在 Nuget 中没有 -version 和 -v 和 --version 等写法,只需要直接输入 nuget 在第一行就会显示版本号 nuget N ...
- C# 从零开始写 SharpDx 应用 绘制基础图形
本文告诉大家通过 SharpDx 画出简单的 2D 界面 本文属于 SharpDx 系列 博客,建议从头开始读 本文分为两步,第一步是初始化,第二步才是画界面 初始化 先创建 RenderForm 用 ...
- LeekCode解题记录
昨天晚上有个LeekCode的比赛,两个半小时解五题,轻松解决前两题后,卡在第三题,还剩半小时时放弃,开始解第五题,解完但未验证通过,第四题只看了下题目. 排名第一的大佬只用了36分钟全部写完. 差距 ...