zoukankan      html  css  js  c++  java
  • 1587: 【例 3】Windy 数

    新姿势:前导0的处理

    当有前导0的时候,0和1也是可以取到的,所以不能用俩数绝对值之差>2来判断,但是!!!

    我们可以把有前导0的pre设为-2啊!那么0和1就可以取到了

    reference:
    https://www.luogu.org/blog/virus2017/solution-p2657

    /*
    reference:
    	
    Date:
    	2019.10.08
    sol:
    	
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    template <typename T>inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define dwn(i,a,b) for(int i=(a);i>=(b);--i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ee(i,u) for(int i=head[u];i;i=e[i].next)
    
    int l,r,len;
    int dp[15][10];
    int bit[10+5];
    
    inline int dfs(int pos,int pre,int lead,int limit){
    	if(pos>len)return 1;
    	if(dp[pos][pre]!=-1 && !limit)return dp[pos][pre];//没有最高位限制,且已经搜过了,所以有前导0的时候可以记录状态 
    	int up=limit?bit[len-pos+1]:9;
    	int res=0;
    	rep(i,0,up){
    		if(abs(i-pre)<2)continue;
    		else if(lead && i==0)
    			res+=dfs(pos+1,-2,1,i==up && limit);
    		else 
    			res+=dfs(pos+1,i,0,i==up && limit);
    	}
    	if(!limit && !lead)dp[pos][pre]=res;//有前导0的时候不能计入结果
    	return res;
    }
    
    inline int work(int x){
    	mem(dp,-1);
    	len=0;
    	while(x){
    		bit[++len]=x%10;
    		x/=10;
    	}
    	return dfs(1,-2,1,1);
    } 
    
    #undef int 
    int main(){
    #define int long long
    	#ifdef WIN32 
    	freopen("test.txt","r",stdin);
    	#endif
    	rd(l),rd(r);
    	printf("%lld
    ",work(r)-work(l-1));
    	return 0;
    }
    
  • 相关阅读:
    OA系统权限管理设计方案【转】
    UML类图几种关系的总结
    在pl/sql中使用exp/imp工具实现oracle数据导出/导入
    page 的范围
    JSP页面跳转的五种方法
    Start with...Connect By
    秒杀系统架构
    对系统负载的理解
    sort(7)
    cat(6)
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11637324.html
Copyright © 2011-2022 走看看