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 ...
随机推荐
- Socket的简单使用
一.Socket: Socket又称”套接字" 网络上的两个程序通过一个双向的通信链接实现数据的交换,这个连接的一端成为一个socket 应用程序通常通过”套接字”向网络发出请求或者应答网络 ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- redis数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- 使用UltraEdit实现从DOS文件到UNIX文件的批量转换
最近把公司从SVN切到GIT下,因为大多同事在Windows下开发,又碰到换行符问题,找到一个批量转换方法 打开UE->在文件中替换,把^p替换成^n,然后设置好要替换的文件和路径,就开始替换吧 ...
- 基于微软平台IIS/ASP.NET开发的大型网站有哪些?
首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/Java平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...
- [.net程序员必看]微软新动向之Android和IOS应用 visual studio 2015 Cordova[原创]
自萨蒂亚·纳德拉(Satya Nadella)上任微软CEO以来,可谓是惊喜不断,仿佛让世界尤其是我们.net程序员心中又燃起了希望.先是免费提供 iOS 版和安卓版 Office:然后在 xbox ...
- Java 代码的基本知识(摘)
(摘自:Java经典入门教程) http://wenku.baidu.com/link?url=IoWI58cD5vzeHN-NL4pN7Gren-RfzydrhjDlETAByC9L-9ANinyL ...
- ES6块级作用域及新变量声明(let)
很多语言中都有块级作用域,但JS没有,它使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域.用var声明的变量具有变量提升(declaration hoist ...
- Windows Azure CN 超业余性能测试
先来说说为什么会有这篇文章吧.从朋友那里搞来个Windows Azure CN的测试帐号,在公司的时候领导的朋友有一个阿里云的服务器,平时部署小东西都往上面丢,不过那是人家的东西,还有其他的应用跑在上 ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...