uestc250windy数数位dp

时间:2014-08-07 12:16:59   收藏:0   阅读:250
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;

int dp[100][100][2];
int up[1000];
int ab(int x)
{
    return x>0? x:-x;
}

int dfs(int pos,int top,int first,int flag)
{
    if(pos<=0) return first==1;
    if(first&&!flag&&~dp[pos][top][first]) return dp[pos][top][first];
    int limit = flag? up[pos]: 9,ret=0;
    for(int i= 0;i<=limit;i++){ 
        int t= ab(top-i);  
        if(t>=2||!first) ret+=dfs(pos-1,i,first||i,flag&&(i==limit)); //这个判断是海哥告诉的,非常吊,自己品味。
    }
    return  flag? ret: dp[pos][top][first] = ret;
}
int solve(int x)
{
    int len=0;
    while(x){
        up[++len]=x%10;
        x/=10;
    }
    return dfs(len,100,0,1);
}
int main()
{
    memset(dp,-1,sizeof(dp));
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        cout<<solve(m) - solve(n-1) <<endl;
    }
    return 0;
}

 

uestc250windy数数位dp,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!