题解 P2657 【[SCOI2009]windy数】
感觉数位DP有点弱,强化一下。。。
这道题是一道比较裸的数位DP。
我们用\(dp[i][j]\)表示长度为\(i\)最高位为\(j\)的windy数有多少个,状态转移方程为\(dp[i][j]=\sum_{abs(j-k)>=2}{dp[i-1][k]}\)。
然后有一个小优化(其实不能算优化吧),就是算一下输入两个数的长度,然后取长度最大值作为第一维的极限,这样就稍微比直接算到\(i=11\)要优一点了。
AC代码如下:
28ms 788kb
// By Ilverene
#include<bits/stdc++.h>
using namespace std;
namespace StandardIO{
template<typename T>inline void read(T &x){
x=0;T f=1;char c=getchar();
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
x*=f;
}
template<typename T>inline void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>=10)write(x/10);
putchar(x%10+'0');
}
}
using namespace StandardIO;
namespace Solve{
// Define your global variables here.
int a,b;
int dp[11][11];
// Define your main functions here.
template<typename T>inline T length(T num){
T ans=0;
for(;num;++ans,num/=10);
return ans;
}
template<typename T>inline T calc(T limit){
memset(dp,0,sizeof(dp));
for(register int i=0;i<=9;++i){
dp[1][i]=1;
}
for(register int i=2;i<=limit;++i){
for(register int j=0;j<=9;++j){
for(register int k=0;k<=j-2;++k){
dp[i][j]+=dp[i-1][k];
}
for(register int k=j+2;k<=9;++k){
dp[i][j]+=dp[i-1][k];
}
}
}
}
template<typename T>inline T calcAll(T n){
T len=0;
T num[11];
for(;n;num[++len]=n%10,n/=10);
T ans=0;
for(register int i=1;i<=len-1;++i){
for(register int j=1;j<=9;++j){
ans+=dp[i][j];
}
}
for(register int i=1;i<num[len];++i){
ans+=dp[len][i];
}
for(register int i=len-1;i>=1;--i){
for(register int j=0;j<=num[i]-1;++j){
if(abs(j-num[i+1])>=2)ans+=dp[i][j];
}
if(abs(num[i+1]-num[i])<2)break;
}
return ans;
}
inline void solve(){
// Write your main logic here.
read(a),read(b);
calc(max(length(a),length(b)));
write(calcAll(b+1)-calcAll(a));
}
}
using namespace Solve;
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
solve();
}
题解 P2657 【[SCOI2009]windy数】的更多相关文章
- C++ 洛谷 P2657 [SCOI2009]windy数 题解
P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...
- 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和 ...
- 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]
题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...
- [洛谷P2657][SCOI2009]windy数
题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0 ...
- Luogu P2657 [SCOI2009]windy数
一道比较基础的数位DP,还是挺套路的. 首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式: \(f[a,b]=f(b)-f(a-1)\) 然后考虑如何求解\(f(x)\).我 ...
- 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 ...
随机推荐
- myEclies项目导入Eclipse中常见问题
需要配置Tomcat 左上方菜单 windosw > Prefrences TomCat JS文件报错 打开项目位置 找到 这个文件打开 删除这一段ok
- mysql linux查看配置文件my.cnf位置
原文:mysql linux查看配置文件my.cnf位置 命令: mysql --help | grep 'Default options' -A 1
- MVC设计模式与JavaWEB三层架构
一.MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controlle ...
- 51 nod 1431 快乐排队
1431 快乐排队 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 有一群人在排队,如果某个人想排到前面去,可以花 ...
- 【Oracle学习笔记】
内容主要包括: (1)三种循环及其简化 (2)游标的使用 (3)异常处理 (4)存储过程 (5)存储函数 (6)触发器 (7)其它pl/sql操作 ---------------loop循环定义变量- ...
- Ubuntu: GlusterFS+HBase安装教程
HBase通常安装在Hadoop HDFS上,但也能够安装在其它实现了Hadoop文件接口的分布式文件系统上.如KFS. glusterfs是一个集群文件系统可扩展到几peta-bytes. 它集合了 ...
- Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
在正常使用应用的过程中.前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停.举个样例.当一个半透明的activity被打开(比如一个dialog样式的activity), ...
- 37、ifconfig命令
很多windows很熟悉ipconfig命令行工具.它被用来获取网络接口配置信息并对此进行改动.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config). 通常须 ...
- What is the difference between Web Farm and Web Garden?
https://www.codeproject.com/Articles/114910/What-is-the-difference-between-Web-Farm-and-Web-Ga Clien ...
- ES线程池设置
每个Elasticsearch节点内部都维护着多个线程池,如index.search.get.bulk等,用户可以修改线程池的类型和大小,线程池默认大小跟CPU逻辑一致 一.查看当前线程组状态 cur ...