BZOJ 1026 【SCOI2009】 windy数
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
Sample Input
1 10
【输入样例二】
25 50
Sample Output
9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
这是我写的第一道数位dp题,心里好开心>_<
因为网上我找不到什么好的题解,所以我觉得最好我自己再写一篇虽然也不一定写得好其实主要还是我太弱了,看不懂
首先,我们可以预处理出在没有任何限制的情况下的windy数。这里认为最高位是第$1$位,则可以令$dp_{i,j}$表示第$i$位填$j$的方案数,我从低位往高位转移,显然$$dp_{i,j}=\sum_{k=0}^{9} dp_{i+1,k}(| k-j| \ge 2)$$
接下来,我们可以处理出$f_i$表示在第$i$位取该位最大值的方案数。设这个数第$i$位为$a_i$,则转移为$$f_i=\sum_{k=0}^{a_{i+1}-1} dp_{i+1,k}(| a_{i}-k| \ge 2)$$
当然,如果$|a_{i+1}-a_i| \ge 2$ ,$f_i$还要加上$f_{i+1}$。
然后,我们可以考虑如何统计答案。既然要求$[l,r]$之间的windy数个数,那么显然可以转为前缀和的差,也就是区间$[1,r]$的答案减去区间$[1,l-1]$的答案。
那么,我们只需知道小于等于$x$的windy数个数即可。我们来考虑下。
首先,我们可以先找到这个数第一个不为$0$的位置$w$。然后,这个位置显然可以放$1$到$a_w-1$,这部分的答案为$\sum_{i=1}^{a_{w}-1} dp_{w,i}$。然后,当这个位置放$a_w$时方案数就是$f_w$。
接下来我们还要处理掉在位置$w$填$0$的情况。设这个数长度为$len$,我们只需再统计一下$\sum_{i=w+1}^{len} \sum_{j=1}^{9}dp_{i,j}$就可以了。
下面是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define INF 2147483647 using namespace std;
typedef long long llg; int a[][],g[][],n,ans,x,y,z;
int f[]; void init(int x){
int now=,ww=;
while(!a[x][ww] && ww<=n) ww++;
memset(g,,sizeof(g));
memset(f,,sizeof(f)); f[n]=;
for(int i=;i<=;i++) g[n][i]=;
for(int i=n-;i;i--){
for(int j=;j<=;j++)
for(int k=;k<=;k++)
if(abs(j-k)>=) g[i][j]+=g[i+][k];
for(int j=;j<a[x][i+];j++)
if(abs(a[x][i]-j)>=) f[i]+=g[i+][j];
if(abs(a[x][i]-a[x][i+])>=) f[i]+=f[i+];
}
for(int i=ww+;i<=n;i++)
for(int j=;j<=;j++) now+=g[i][j];
if(ww<=n){
for(int i=;i<a[x][ww];i++) now+=g[ww][i];
now+=f[ww];
}
if(x) ans+=now; else ans-=now;
} int main(){
File("a");
scanf("%d %d",&x,&y);
x--;z=y; while(z) n++,z/=;
for(int i=n;i;i--){
a[][i]=x%,x/=;
a[][i]=y%,y/=;
}
init(); init();
printf("%d",ans);
return ;
}
BZOJ 1026 【SCOI2009】 windy数的更多相关文章
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- bzoj 1026 [SCOI2009]windy数(数位DP)
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4550 Solved: 2039[Submit][Sta ...
- BZOJ 1026: [SCOI2009]windy数( dp )
dp..dp(x, t) 表示共x位, 第x位为t有多少个windy数. 对答案差分, 我们只需统计1 ~ l-1和1 ~ r的windy数数量. 考虑如何计算[1, n]的答案 : 从最高位到最低位 ...
- bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...
- BZOJ 1026: [SCOI2009]windy数 【数位dp】
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...
- bzoj 1026: [SCOI2009]windy数 & 数位DP算法笔记
数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...
- BZOJ 1026: [SCOI2009]windy数
题目 人生中的第一道数位dp,很有趣,虽然我很快推出了结构,但是过程却迟迟没有写出来,最后看别人的题解才恍然大悟 d[i][j]表示数位为i,最高位为j的方案数 DpInit非常简单,复杂度应该是O( ...
- bzoj 1026: [SCOI2009]windy数【数位dp】
忘记limit不能记WA了一发-- 典型数位dp,变成work(r)-work(l-1),然后dfs的时候记录w当前位置,la上一个数选的什么,lm当前位是否有上限,ok当前位是否可以不考虑差大于等于 ...
- bzoj 1026 [SCOI2009]windy数——数位dp水题
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #in ...
- 数位DP BZOJ 1026 [SCOI2009]windy数
题目链接 前面全是0的情况特判 #include <bits/stdc++.h> int dp[10][10]; int digit[10]; int DFS(int pos, int v ...
随机推荐
- C语言中的复合类型
复合类型 一.掌握的类型 1. 指针数组 int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组 int a,b,c,d; arr[0] = & ...
- android [因为开了刷机精灵等软件 导致adb 无法使用]error: could not install *smartsocket* listener: cannot bind
今天 使用 刷机精灵后 在使用android studio 时发现 adb 无法正常使用. 于是 想重启 adb.exe , 直接在DOS里杀掉adb输入:adb kill-server 再启动输 ...
- 用Objective-C写了一个简单的批量更改文件名的程序
前言:因为本人要高仿一个app,从app中解压asserts得到的所有图片文件,文件名都带有~iPhone这个干扰的名字,为了去除这个~iPhone这个字符串,所以本人写了个简答的批量更改所有文件名的 ...
- vs.net git版本仓库使用 之解决冲突方法 原创
vs.net git 之解决冲突方法 如果别人已经修改推送到服务器,但自已本地未进行同部更新,那么就会出现要解决冲突的提示! 具体解决方法为: ... ... 下载word离线版:vs.net_git ...
- Git的常用操作,记录下
首先生成密钥 ssh-keygen -t rsa -C "your_email@youremail.com" 然后打开workdir,敲 git init 设置一个远端库 git ...
- 一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存
自2014年以来,SaaS.CRM.OA.ERP.HR.APM.进销存.财务系统等,这些名词大量出现在微信朋友圈.电视楼宇广告和千百万融资资讯中.它们到底是什么意思?相互之间又有什么区别?在这个飞速发 ...
- ORACLE DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象查看
在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段.下面 ...
- coursera机器学习-支持向量机SVM
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
- Java NIO 基础
Java在JDK1.4中引入了 java.nio 类库,为Java进军后端Server和中间件开发打开了方便之门. 一般而言,这里的 nio 代表的是 New I/O,但是从实质上来说,我们可以将其理 ...
- oracle DB_LINK
1.先创建远程数据库服务名(注意,如果服务器既有oracle服务端又有客户端,需要在服务端的tnsnames.ora中配置服务名,否则会报如下错误): SQL> select count(*) ...