zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    第14周总结
    第十三周总结
    第十二周总结
    第十一周总结
    第十次助教小结
    第九次小结-关注的助教
    第八次点评
    助教总结
    助教小结13
    助教小结12
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11840144.html
Copyright © 2011-2022 走看看