zoukankan      html  css  js  c++  java
  • bzoj1026

    题意:

    求A-B之间有多少个数,满足没一个数的每个相邻数位的差的绝对值大于等于2

    题解:

    数位dp

    看到了数位差就想到了

    f[i][j]表示i位,开头为j

    然后转移

    最后用前缀和计数

    代码:

    #include<bits/stdc++.h>
    const int inf=1e9;
    typedef long long ll;
    using namespace std;
    int f[15][15],base[15],A,B;
    void ini()
    {
        base[1]=1;
        for (int i=2;i<=10;i++)base[i]=base[i-1]*10;
        scanf("%d%d",&A,&B);
        for (int i=0;i<=9;i++)f[1][i]=1;
        for (int i=2;i<=10;i++)
         for (int j=0;j<=9;j++)
          for (int k=0;k<=9;k++)
           if (abs(j-k)>=2)f[i][j]+=f[i-1][k];
    }
    int cnt(int n)
    {
        if (!n)return 0;
        int tmp=0,w=10;
        while (base[w]>n)w--;
        for (int i=1;i<w;i++)
         for (int j=1;j<=9;j++)tmp+=f[i][j];
        int cur=n/base[w];
        for (int i=1;i<cur;i++)tmp+=f[w][i];
        n%=base[w];
        int pre=cur;
        for (int i=w-1;i;i--)
         {
            cur=n/base[i];
            if (i!=1)
              {
                for (int j=0;j<cur;j++)
                 if (abs(pre-j)>=2)tmp+=f[i][j];
             }
            else 
             {
                for (int j=0;j<=cur;j++)
                 if (abs(pre-j)>=2)tmp+=f[i][j];
             }
            if (abs(cur-pre)<2)break;
            pre=cur;
            n%=base[i];
         }
        return tmp;
    }
    int main()
    {
        ini();
        printf("%d",cnt(B)-cnt(A-1));
        return 0;
    }
  • 相关阅读:
    Go 学习之旅
    IdentityServer4 3.1.x 迁移到 4.x
    Redash 二开
    frp 内网穿透远程桌面(Windows 10)配置
    Redash 二开
    Redash 二开
    Nginx 强制 HTTPS 配置
    ASP.NET Core 奇淫技巧之SPA部署
    .NET Core 对接微信小程序数据解密
    19c生产enq: FB
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8446378.html
Copyright © 2011-2022 走看看