【bzoj1026】 SCOI2009—windy数

http://www.lydsy.com/JudgeOnline/problem.php?id=1026 (题目链接)

题意

  在区间${[A,B]}$有多少个数相邻两个数位上的数之差至少为2。

Solution

  数位dp,右转题解:LCF

  其中${f[i][0]}$,表示的是第${i}$位为${0}$的方案数,并不是不取${i}$位。

细节

  LL

代码

// bzoj1026
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf (1ll<<30)
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

LL f[20][10],g[20],ans;
int n,a[2],t[20];

LL solve(int p) {
	memset(f,0,sizeof(f));
	memset(g,0,sizeof(g));
	for (n=0;a[p];a[p]/=10) t[++n]=a[p]%10;
	for (int i=0;i<10;i++) f[1][i]=1;
	for (int i=2;i<=n;i++)
		for (int j=0;j<10;j++)
			for (int k=0;k<10;k++) if (abs(j-k)>1) f[i][j]+=f[i-1][k];
	g[1]=1;
	for (int i=2;i<=n;i++) {
		for (int j=0;j<t[i-1];j++)
			if (abs(t[i]-j)>=2) g[i]+=f[i-1][j];
		if (abs(t[i]-t[i-1])>1) g[i]+=g[i-1];
	}
	LL res=0;
	for (int i=1;i<n;i++)
		for (int j=1;j<10;j++) res+=f[i][j];
	for (int i=1;i<t[n];i++) res+=f[n][i];
	return res+g[n];
}
int main() {
	scanf("%d%d",&a[0],&a[1]);a[0]--;
	ans-=solve(0);
	ans+=solve(1);
	printf("%lld",ans);
	return 0;
}
时间: 2024-08-07 09:09:56

【bzoj1026】 SCOI2009—windy数的相关文章

bzoj1026 [SCOI2009]windy数

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6392  Solved: 2854[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数 Sample I

bzoj1026: [SCOI2009]windy数(数位dp)

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8203  Solved: 3687[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数 Sample

【数位DP】bzoj1026: [SCOI2009]windy数

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 1864[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数. Sample

[BZOJ1026][SCOI2009]windy数 解题报告|数位dp

Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直还是有点怕数位DP的...包括今天做这道简单的小题也花了很久的时间处理细节. 首先大体的思路非常明显,定义一个DP f[i,j]表示第i位放数字j有多少种方法,可以通过前一位的一些满足的数字推出这一位. 但是如何来解决在某个数A的范围内呢...? 并且一旦前面的没有取满,这一位都是可以0..9任意取

bzoj1026: [SCOI2009]windy数 数位dp

题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 题意: Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数 思路: 数位dp,记忆化搜索. 1 #include <bits/stdc++.h> 2 3 using namesp

BZOJ1026 SCOI2009 Windy数 一般DP

题意:求[A,B]之间,任意相邻两位差值均大于等于2的数的个数题解:设f[i][j]=第i位为j的合法的数的数量,显然有f[i][j]=f[i-1][k],|k-j|≥2.至于统计答案,我们只要能求1-U之间的合法的数的数量,显然答案就是Ans[B]-Ans[A-1].至于Ans[i]……因为Ans[10^t]比较好求,所以一位一位统计就好. #include <cmath> #include <cstdio> #include <cstring> #include &

【分块打表】bzoj1026 [SCOI2009]windy数

#include<cstdio> using namespace std; #define BN 380000 const int table[]={0,79595,158824,202174,246052,316791,359819,411663,482117,517179,574651,649803,674577,742659,818419,831971,907450,978470,1000268,1073090,1146729,1168243,1236041,1304374,132588

【luogu2657】【bzoj1026】 [SCOI2009]windy数 [动态规划 数位dp]

P2657 [SCOI2009]windy数 bzoj1026 一本通说这是一道数位dp模板题 emmmmm 就是逐位确定 f[i][j]表示填了i位数其最高位数字为j 然后就去求可能方案数 分为 不满足x的位数的严格小于x的全部情况 和x的位数相同 但最高位小于x的最高为的全部方案数 和x的位数相同 有一位比x的对应位数小的全部方案数 其余位数对应数字都相同(这是数位dp常用的一个性质:对于一个小于n的数 它从高位到低位一定会出现某一位上的数字小于n所对应这一位上的数字) PS 因为x不一定为

bzoj 1026 [SCOI2009]windy数(数位DP)

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4550  Solved: 2039[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数. Sample

【BZOJ-1026】windy数 数位DP

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5230  Solved: 2353[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数 Sample I