• [SCOI2009]windy数


    题目描述

    windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,

    在A和B之间,包括A和B,总共有多少个windy数?

    输入输出格式

    输入格式:

    包含两个整数,A B。

    输出格式:

    一个整数

    输入输出样例

    输入样例#1: 复制
    1 10
    输出样例#1: 复制
    9
    输入样例#2: 复制
    25 50
    
    输出样例#2: 复制
    20
    

    说明

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

    数位dp裸题,记忆化搜索

    要判断前导0

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 int f[21][11],s[21];
     8 int dfs(int pos,int pre,int k,int flag)
     9 {int i;
    10   if (pos==0) return 1;
    11   if (k&&!flag&&f[pos][pre]!=-1) return f[pos][pre];
    12   int ed=9,cnt=0;
    13   if (flag) ed=s[pos];
    14   for (i=0;i<=ed;i++)
    15     if (pre==-1||abs(i-pre)>=2)
    16     {
    17       if (k==0&&i==0) cnt+=dfs(pos-1,-1,0,flag&&(i==ed));
    18       else
    19       cnt+=dfs(pos-1,i,k|(i!=0),flag&&(i==ed));
    20     }
    21   if (!flag&&k) f[pos][pre]=cnt;
    22   return cnt;
    23 }
    24 int solve(int x)
    25 {
    26   memset(f,-1,sizeof(f));
    27   int len=0;
    28   if (x==0) return 1;
    29   while (x)
    30     {
    31       s[++len]=x%10;
    32       x/=10;
    33     }  
    34   return dfs(len,-1,0,1);
    35 }
    36 int main()
    37 {int A,B;
    38   cin>>A>>B;
    39   printf("%d",solve(B)-solve(A-1));
    40 }
  • 相关阅读:
    eclipse 不自动提示和Alt + / 没提示和eclipse增强代码提示
    uboot 添加命令
    ps and kill command
    C 类型volatile 的作用
    git tutorial
    python 与命令
    C++ new and delete
    Glade3 tutorial in chinese
    查找IP与MAC
    ns3 无线资料
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8468778.html
Copyright © 2020-2023  润新知