windy数

windy数指的是相邻两位差至少为2的数。问区间[a,b]中有多少个windy数

 

调了半个多小时,不过调出来之后对数位dp理解大大加深

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

inline int read()
{
    int f=1,x=0;
    char ch=getchar();
    while(ch<'0' || ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int a,b;
int c[15],f[15][10][2];//f数组要开3位(这就是我为什么要调它)

int dp(int pos,int num,bool done,bool flag)
{
    
    if(pos==0) return 1;
    if(!flag && f[pos][num][done]!=-1) return f[pos][num][done];
    int res=0;
    int r=flag ? c[pos] : 9;
    for(int i=0;i<=r;i++)
    {
        if(abs(i-num)<2 && !done) continue;
        res+=dp(pos-1,i,done && i==0,flag && i==c[pos]);
    }
    f[pos][num][done]=res;
    return res;
}

int find(int x)
{
    memset(f,-1,sizeof(f));
    int cnt=0;
    while(x>0)
    {
        c[++cnt]=x%10;
        x/=10;
    }
    return dp(cnt,0,1,1)-1;
}

int main()
{
    a=read(); b=read();
    printf("%d\n",find(b)-find(a-1));
    return 0;
}

 

posted @ 2018-12-08 15:42  白驹过隙----青春绿  Views(192)  Comments(0Edit  收藏  举报