BZOJ1026 - [SCOI2009]windy数

BZOJ1026 - Click Here

  

Description

  windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?

  

Input

  包含两个整数,A B。

  100%的数据,满足1<=A<=B<=2000000000。

  

Output

  一个整数。

  

Solutions

  数位DP的入门题?

  询问[a,b]区间内的windy数。很显然,只要求出[1,a-1]的windy数和[1,b]的windy数就可以得到答案。

  因此,现在问题就是如何求[1,k]区间内的windy数。

  定义$f[i][j]$为位数为$i$,最高位为$j$且最高位与数字$k$第$i$位不相等的windy数;

  定义$g[i][j]$为位数为$i$,最高位为$j$且最高位与数字$k$第$i$位相等的windy数。

  

  根据windy数的定义,很容易得到递推式:

  $f[i][j]=\sum f[i-1][k],|j-k|>1$

  $g[i][j]=g[i-1][num_{i-1}]+\sum_{p=0}^{num_{i-1}-2}f[i-1][p]$,其中$num_{i}$表示数字$k$的第i位。

  

  答案即为$\sum_{i=1}^{len-1} \sum_{j=1}^{9}f[i][j]+\sum_{j=1}^{num_{len}-1}f[len][j]+g[len][num_{len}]$,其中$len$为k的位数。

  

CODE

CODE - Click Here

本站总访问量次 | 本站访客数人次

Powered by Hexo | Designed by iTimeTraveler | Refined by CSHwang