【BZOJ1026】【SCOI2009】windy数

传送门~:http://www.lydsy.com/JudgeOnline/problem.php?id=1026

数位dp傻题QaQ

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 int f[15][15], A, B, da[15];
 7 void get_ready(){
 8     for (int i = 0; i <= 9; i++) f[1][i] = 1;
 9     for (int i = 2; i <= 10; i++){
10         for (int j = 0; j <= 9; j++) {
11             for (int k = 0; k <= 9; k++) {
12                 if (abs(j-k) >= 2)    f[i][j] += f[i-1][k];
13             }
14         }
15     }
16 }
17
18 int calc(int a){
19     if (a == 0) return 0;
20     int ret = 0, len = 0;
21     do{
22         da[++len] = a % 10;
23         a /= 10;
24     }while(a);
25     for (int i = 1; i < len; i++)
26         for (int j = 1; j <= 9; j++)
27             ret += f[i][j];
28     for (int i = 1; i < da[len]; i++) ret += f[len][i];
29     for (int i = len-1; i > 0; i--) {
30         for (int j = 0; j < da[i]; j++)
31             if (abs(j-da[i+1]) >= 2) ret += f[i][j];
32         if (abs(da[i]-da[i+1]) < 2) break;
33     }
34     return ret;
35 }
36
37 int main(){
38     freopen("bzoj1026.in", "r", stdin);
39     freopen("bzoj1026.out", "w", stdout);
40     get_ready();
41     scanf("%d%d", &A, &B);
42     printf("%d\n", calc(B+1) - calc(A));
43     return 0;
44 }

_(:з」∠)_

时间: 2025-01-05 18:25:22

【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