【bzoj1026】windy数

江泽OJ好,远离bzoj保平安。

仍然沿用之前的记忆化搜索的办法即可。

#include<bits/stdc++.h>
#define N 10010
using namespace std;
int a[20],dp[20][20];
int dfs(int x,int pre,int lim){
    if(x==-1)return 1;
    if(!lim&&~dp[x][pre]&&pre>=0)return dp[x][pre];
    int maxv=lim?a[x]:9,ret=0;int st=0;
    for(int i=0;i<=maxv;i++){
        if(abs(i-pre)<2)continue;
        st=i;if(i==0&&pre==-10)st=pre;
        ret+=dfs(x-1,st,lim&&(i==maxv));
    }
    if(pre>=0&&!lim)dp[x][pre]=ret;
    return ret;
}
inline int work(int x){
    int len=0;
    while(x){a[len++]=x%10;x/=10;}
    memset(dp,255,sizeof(dp));
    return dfs(len-1,-10,1);
}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int main(){
    int l=read(),r=read();
    printf("%d\n",work(r)-work(l-1));
}

 

posted @ 2017-06-12 10:03  zcysky  阅读(...)  评论(... 编辑 收藏