• P2657 [SCOI2009]windy数


    注意此类要处理前导零的数位DP题,因为如果前面全是0,这一位可以填0和1。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    
    using namespace std;
    
    int dp[20][20],num[20];
    
    inline int dfs(int now,int pre,bool limit)
    {
        if(now==0) return 1;
        if(dp[now][pre]!=-1&&!limit) return dp[now][pre];
        int ans=0,up=9;
        if(limit) up=num[now];
        for(register int i=0;i<=up;++i)
        {
            if((abs(i-pre))<2) continue;
            if(i==0&&pre==-10) ans+=dfs(now-1,-10,limit&&(i==num[now]));
            else ans+=dfs(now-1,i,limit&&(i==num[now]));
        }
        if(!limit) dp[now][pre]=ans;
        return ans;
    }
    
    inline int solve(int k)
    {
        memset(dp,-1,sizeof(dp));
        int pos=0;
        while(k>0)
        {
            num[++pos]=k%10;
            k/=10;
        }
        return dfs(pos,-10,true);
    }
    
    int main()
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d
    ",solve(y)-solve(x-1));
        return 0;
    }
  • 相关阅读:
    OS快速开发必备
    YYmodel 郭耀源 底层分析
    UITableView使用总结和性能优化
    文件操作
    DOM解析
    SAX解析
    Gallery
    菜单(menu)
    计时器(Chronometer)、标签(TabHost)
    ListActivity
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11840144.html
Copyright © 2020-2023  润新知