zoukankan      html  css  js  c++  java
  • P2657 [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 。

    代码

    状态:f[i][j]表示搜到第i位,上一位数是j的情况下的方案总数

    限制条件:相邻两位绝对值大于等于2

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int md=20;
    ll dp[md][md];//len,st,
    ll a[md];
    ll dfs(int len,int pre,bool lead,bool limit)
    {
        if(!len)return 1;
        if(~dp[len][pre]&&!lead&&!limit)return dp[len][pre];
        int ret=0,res=limit?a[len]:9;
        for(int i=0;i<=res;i++)
        {
            if(abs(i-pre)<2)continue;
            if(lead&&!i)ret+=dfs(len-1,-2,1,limit&&i==res);
            else ret+=dfs(len-1,i,0,limit&&i==res);
        }
        return limit||lead?ret:dp[len][pre]=ret;
    }
    ll f(ll x)
    {
        int len=0;
        memset(dp,-1,sizeof(dp));
        while(x)a[++len]=x%10,x/=10;
        return dfs(len,-2,1,1);
    }
    int main()
    {
        ll l,r;
        scanf("%lld%lld",&l,&r);
        printf("%lld",f(r)-f(l-1));
        return 0;
    }
    View Code



  • 相关阅读:
    LeetCode 121. Best Time to Buy and Sell Stock
    LeetCode 221. Maximal Square
    LeetCode 152. Maximum Product Subarray
    LeetCode 53. Maximum Subarray
    LeetCode 91. Decode Ways
    LeetCode 64. Minimum Path Sum
    LeetCode 264. Ugly Number II
    LeetCode 263. Ugly Number
    LeetCode 50. Pow(x, n)
    LeetCode 279. Perfect Squares
  • 原文地址:https://www.cnblogs.com/DriverBen/p/11009368.html
Copyright © 2011-2022 走看看