C++ 洛谷 P2657 [SCOI2009]windy数 题解
这题还是很简单的啦(差点没做出来
个位打表大佬请离开(包括记搜),我这里讲的是DP!!!
首先Cal(b+1)-Cal(a),大家都懂吧(算了,复制一遍吧<<((因为当前的Cal(k)是计算出从1到k-1的符合条件的数的个数,所以要计算a~b的个数要用Cal(b+1)-Cal(a).))>>)
f[i][j]定义一样,以j开始的且符合条件的总位数为i的答案个数.(好绕啊)
预处理转移不用讲吧:f[i][j]+=f[i-1][k];(还是复制了)
有个小细节,每个一位数答案都为1,所以分f[1][j]=0.
重点讲讲不同之处(Cal函数):
显然位数比x要小的数字都是合法的都在[1,x)区间内,直接统计就行.(第一次加ans)
位数和x一样最高位的数字比x小的数字都是合法的都在[1,x)区间内直接统计就行(第二次加ans)
位数和x一样,最高位又和x一样我们从左到右扫一遍x各个位子上的数字大小然后枚举合法的该位子上的数[0,9]判断是否合法就行。(第三次加ans)
#include<bits/stdc++.h>
using namespace std;
int f[][];
int a,b;
int digit[],cnt,ans;
void init ()
{
for (int i=;i<=;i++) f[][i]=;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
for (int k=;k<=;k++)
if(abs(j-k)>=)
f[i][j]+=f[i-][k];
}
int Cal(int x)
{
//freopen("a.in", "r", stdin);
memset(digit,,sizeof(digit));
ans=;
cnt=;
while(x)
{
digit[++cnt]=x%;
x/=;
}
//三种情况
for (int i=;i<cnt;i++)
for (int j=;j<=;j++)
ans+=f[i][j]; //在不到x位数前,所有情况符合。
for (int i=;i<digit[cnt];i++) ans+=f[cnt][i]; //x位数,最高位未到digit[cnt]。
for (int i=cnt-;i>=;i--)//x位数,最高位到digit[cnt]
{
for (int j=;j<digit[i];j++)
if(abs(j-digit[i+])>=)
ans+=f[i][j];
if(abs(digit[i]-digit[i+])<)
break;
}
//printf("%d\n",ans);
return ans;
}
void work()
{
cin>>a>>b;
cout<<Cal(b+)-Cal(a)<<'\n';
}
int main()
{
init();
work();
return ;
}
C++ 洛谷 P2657 [SCOI2009]windy数 题解的更多相关文章
- 洛谷P2657 [SCOI2009]windy数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分 ...
- 洛谷 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 ...
- 洛谷 P2657 [SCOI2009]windy数
题意简述 求l~r之间不含前导零且相邻两个数字之差至少为2的正整数的个数 题解思路 数位DP 代码 #include <cstdio> #include <cstring> # ...
- BZOJ1026或洛谷2657 [SCOI2009]windy数
BZOJ原题链接 洛谷原题链接 简单的数位\(DP\),套模板就好. #include<cstdio> #include<cstring> using namespace st ...
- 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 ...
随机推荐
- 运行时动态伪造vsprintf的va_list
运行时动态伪造vsprintf的va_list #include <stdio.h> int main() { char* m = (char*) malloc(sizeof(int)*2 ...
- 精装友好联络算法实现借壳和RI
精装友好联络会 注册算法分析: 1. 许可证由三部分组成. 2. 的登记号的第一部分是顺序编号0x6d模 3. 登记代码的第二部分: 先将订单号与0XB25F1异或,将异或后的结果转换成十进制字符串 ...
- Android中对sqlite加密--SQLCipher
原文:Android中对sqlite加密--SQLCipher android中有些时候会将一些隐私数据存放在sqlite数据库中,在root过的手机中通过RE就能够轻松的打开并查看数据库所有内容,所 ...
- thinkphp5 的一些笔记
Model里面的一些属性添加 protected $resultSetType = 'collection'; protected $autoWriteTimestamp = 'timestamp'; ...
- System.Data.SQLite 中GUID的处理
原文:System.Data.SQLite 中GUID的处理 项目中正好用到System.Data.SQLite,在手持上使用这个数据库,因为要做数据同步,所以表中的主键都是Guid的数据类型. 在数 ...
- Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
原文:Android零基础入门第11节:简单几步带你飞,运行Android Studio工程 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studi ...
- MySql5.7.11 for Windows 安装(二)
原文:MySql5.7.11 for Windows 安装(二) 安装之后,首先创建data文件夹(旧版本本来就有),管理员打开cmd,cd到bin文件夹,输入 mysqld –initialize- ...
- MongoDB对文档的操作
插入文档 db.COLLECTION_NAME.insert({doc1},{doc2},...) e.g.:db.collection.insert({name:'123',age:12},{nam ...
- 关于这次KPL春季决赛的感悟
QG 4:0 横扫AG超玩会,关于这一点想写一些自己的感悟,AG超玩会一直都是 4:0 横扫别人,这次在冠军赛被别人横扫,一点喘息的机会都没有. 1.QGhappy 跟本没把AG超玩会放在眼里,很 ...
- 大数据基础之Kafka(1)简介、安装及使用
kafka2.0 http://kafka.apache.org 一 简介 Kafka® is used for building real-time data pipelines and strea ...