【数位DP】【P2657】[SCOI2009]windy数
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为 \(2\) 的正整数被称为windy数。 windy想知道,
在 \(A\) 和 \(B\) 之间,包括 \(A\) 和 \(B\),总共有多少个windy数?
Limitation
\(1 \leq A \leq B \leq 2000000000\)
Solution
前天重写这个题,换了一种比较好写的DP方式,这里记下来。
考虑由于前导 \(0\) 和顶上界都最多可能有 \(1\) 中方案,因此直接使用一个 bool 变量记录即可。
设 \(f_{i, j}\) 是考虑前 \(i\) 位,第 \(i\) 位是 \(j\) 且不顶上界的方案数,这样的转移就非常好写了。、
Code
#include <cmath>
#include <cstdio>
#include <cstring>
const int maxn = 100;
int x, y;
int A[maxn], B[maxn];
ll frog[maxn][10];
int ReadNum(int *p);
ll calc(const int *const num, const int n);
int main() {
freopen("1.in", "r", stdin);
int x = ReadNum(A); y = ReadNum(B);
for (int i = x - 1; ~i; --i) {
if ((--A[i]) >= 0) {
break;
} else {
A[i] = 9;
}
}
if (A[x] == 0) { --x; }
qw(calc(B, y) - calc(A, x), '\n', true);
return 0;
}
int ReadNum(int *p) {
auto beg = p;
do *p = IPT::GetChar() - '0'; while ((*p < 0) || (*p > 9));
do *(++p) = IPT::GetChar() - '0'; while ((*p >= 0) && (*p <= 9));
return p - beg;
}
ll calc(const int *const num, const int n) {
if (n <= 1) {
return num[0];
}
memset(frog, 0, sizeof frog);
bool upc = true;
for (int i = 1; i < num[0]; ++i) {
frog[0][i] = 1;
}
for (int i = 1; i < n; ++i) {
int di = i - 1;
for (int j = 0; j < 10; ++j) {
for (int k = 0; k < 10; ++k) if (abs(j - k) >= 2) {
frog[i][j] += frog[di][k];
}
++frog[i][j];
}
--frog[i][0];
if (upc) {
for (int k = 0; k < num[i]; ++k) if (abs(num[di] - k) >= 2) {
++frog[i][k];
}
if (abs(num[di] - num[i]) < 2) {
upc = false;
}
}
}
ll _ret = 0;
for (int i = 0, dn = n - 1; i < 10; ++i) {
_ret += frog[dn][i];
}
return _ret + upc;
}
【数位DP】【P2657】[SCOI2009]windy数的更多相关文章
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- P2657 [SCOI2009]windy数
P2657 [SCOI2009]windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B ...
- 洛谷 P2657 [SCOI2009]windy数 解题报告
P2657 [SCOI2009]windy数 题目描述 \(\tt{windy}\)定义了一种\(\tt{windy}\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(\tt{wi ...
- 洛谷——P2657 [SCOI2009]windy数
P2657 [SCOI2009]windy数 题目大意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和 ...
- C++ 洛谷 P2657 [SCOI2009]windy数 题解
P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...
- 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]
题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...
- P2657 [SCOI2009]windy数 数位dp
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...
- 题解 BZOJ1026 & luogu P2657 [SCOI2009]windy数 数位DP
BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...
- 洛谷P2657 [SCOI2009]windy数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分 ...
- Luogu P2657 [SCOI2009]windy数
一道比较基础的数位DP,还是挺套路的. 首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式: \(f[a,b]=f(b)-f(a-1)\) 然后考虑如何求解\(f(x)\).我 ...
随机推荐
- 使用velero进行kubernetes灾备
使用velero可以对集群进行备份和恢复,降低集群DR造成的影响.velero的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来.可以从官方文档查看可接收的对象存储,本 ...
- CentOS中设置Apache服务器网站访问日志[每天的日志]
在阿里云的linux 服务器下Apache的日志默认设置是七天更新一次, 并且所在的目录无法通过FTP浏览器查看, 这样让小白操作起来非常麻烦 可以使用rotatelogs来设置服务器的网站访问日志按 ...
- 集合类源码(四)Collection之BlockingQueue(ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue)
ArrayBlockingQueue 功能 全名 public class ArrayBlockingQueue<E> extends AbstractQueue<E> imp ...
- java中 Math和StrictMath
今天无意中看到java api中有StrictMath 这个工具类,发现它部分调用实现是用了Math中的实现.Math 这个类API 1.0版本就有了,StrictMath API是1.3版本才出来的 ...
- Java学习:注解简介
JAVA 注解的基本原理 以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高. 于是就有人提出来一种标记 ...
- oracle日期格式和java日期格式区别 HH24:mm:ss和HH24:mi:ss的区别
转载自:https://blog.csdn.net/yubin_yubin/article/details/18655553 在日期数据库数据查询出来的时候经常会to_char()一下,格式化一下日期 ...
- Redux-saga-整理
介绍 在redux中更好的解决异步操作 redux-saga相当于在redux原来的数据流中多了一层,对action进行监听 接收到action时,派发一个任务维护state saga通过Genera ...
- WPF 精修篇 BackgroundWorker
原文:WPF 精修篇 BackgroundWorker 效果 <Grid> <Grid.RowDefinitions> <RowDefinition Height=&qu ...
- JAVA学习之开发环境配置
JAVA SDK 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 版 ...
- git 命令从入门到放弃
o(︶︿︶)o 由于项目使用 git 作为版本控制工具,自己可以进行一些常用操作但是有时候还是会忘掉,导致每次遇到 git 命令的使用问题时就要再查一遍,效率就立马降下来了,所以今天就来一个从头到尾 ...