【BZOJ】【1026】【SCOI2009】Windy数

数位DP



cxlove基础数位DP第三题

= =预处理是个很有用的东西!然后就是分类讨论!

 1 /**************************************************************
 2     Problem: 1026
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:1272 kb
 8 ****************************************************************/
 9
10 //BZOJ 1026
11 #include<cmath>
12 #include<vector>
13 #include<cstdio>
14 #include<cstring>
15 #include<cstdlib>
16 #include<iostream>
17 #include<algorithm>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 #define pb push_back
22 using namespace std;
23 int getint(){
24     int v=0,sign=1; char ch=getchar();
25     while(!isdigit(ch)) {if(ch==‘-‘) sign=-1; ch=getchar();}
26     while(isdigit(ch))  {v=v*10+ch-‘0‘; ch=getchar();}
27     return v*sign;
28 }
29 const int N=1e7+10,INF=~0u>>2;
30 const double eps=1e-8;
31 /*******************template********************/
32 int dp[15][15];
33 void init(){
34     F(i,0,9) dp[1][i]=1;
35     F(i,2,10)
36         F(j,0,9)
37             F(k,0,9)
38                 if (abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
39 }
40 int solve(int n){
41     int len=0,bit[15];
42     for(;n;n/=10) bit[++len]=n%10;
43     bit[len+1]=0;
44     int ans=0;
45     //长度为1~len-1的
46     F(i,1,len-1)
47         F(j,1,9)
48             ans+=dp[i][j];
49     //长度为len,但最高位没达到上界
50     F(j,1,bit[len]-1) ans+=dp[len][j];
51     //长度为len,且最高位达到上界
52     D(i,len-1,1){
53         F(j,0,bit[i]-1)
54             if (abs(j-bit[i+1])>=2) ans+=dp[i][j];
55         if (abs(bit[i]-bit[i+1])<2) break;
56     }
57     return ans;
58 }
59 int main(){
60     init();
61     int l,r;
62     while(scanf("%d%d",&l,&r)!=EOF)
63         printf("%d\n",solve(r+1)-solve(l));
64     return 0;
65 }
66 

时间: 2024-09-29 22:32:31

【BZOJ】【1026】【SCOI2009】Windy数的相关文章

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 [SCOI2009]windy数 数位dp

1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1026 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数.

bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy 数个数: 但不明白为什么最后一位拿出来特判 ret++  不对,而写在循环里,特判 i==1 就对了... 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&g

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 <= 2

BZOJ 1026: [SCOI2009]windy数 【数位dp】

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 <= 2

bzoj 1026 [SCOI2009]windy数——数位dp水题

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=15; int l,r,dg[N],dp[N][N]; int dfs(int p,int lst,bo

数位DP BZOJ 1026 [SCOI2009]windy数

题目链接 前面全是0的情况特判 #include <bits/stdc++.h> int dp[10][10]; int digit[10]; int DFS(int pos, int val, int zero, bool limit) { if (pos == -1) { return 1; } int &now = dp[pos][val]; if (!limit && zero && now != -1) { return now; } int

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

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

【BZOJ】1026: [SCOI2009]windy数(数位dp)

http://www.lydsy.com/JudgeOnline/problem.php?id=1026 我果然很弱啊... 考虑数位dp.枚举每一位,然后限制下一位即可. 一定要注意啊!在dfs的时候line这个要&&啊....要不然wa了两发.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>

1026: [SCOI2009]windy数

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