• 【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>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << (#x) << " = " << (x) << endl
    #define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
    #define printarr1(a, b) for1(_, 1, b) cout << a[_] << '	'; cout << endl
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=25;
    int a[N], d[N][10], len;
    int dfs(int x, int num, int front, int line) {
    	if(!x) {
    		if(front) return 0; //注意前导0不要,其实要不要都可以a。。。因为重复的会被剪掉。。
    		return 1;
    	}
    	if(!front && !line && d[x][num]!=-1) return d[x][num];
    	int last=9, tot=0; if(line) last=a[x];
    	for1(i, 0, last) {
    		if(front) {
    			if(i==0) tot+=dfs(x-1, i, 1, line && i==last); //这个line一定要并上啊QAQ
    			else tot+=dfs(x-1, i, 0, line && i==last);
    		}
    		else if(abs(i-num)>=2) tot+=dfs(x-1, i, 0, line && i==last);
    	}
    	if(!front && !line) d[x][num]=tot;
    	return tot;
    }
    int getans(int x) {
    	len=0;
    	while(x) a[++len]=x%10, x/=10;
    	return dfs(len, 0, 1, 1);
    }
    int main() {
    	CC(d, -1);
    	int x=getint(), y=getint();
    	print(getans(y)-getans(x-1));
    	return 0;
    }
    

    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 。

    Source

  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4006193.html
Copyright © 2020-2023  润新知